乐于分享
好东西不私藏

【CSP】CSP-X 2018真题 | 11的倍数 luogu-B4075 (适合GESP三级及以上考生练习)

【CSP】CSP-X 2018真题 | 11的倍数 luogu-B4075 (适合GESP三级及以上考生练习)
科普类资源清单
🤞信奥业余科普

GESP学习资源清单

真题
练习题
考纲解析
一级真题解析一级练习题清单111-8级全考纲解析
二级真题解析二级练习题清单GESP/CSP必备技能
三级真题解析三级练习题清单考纲解密
四级真题解析四级练习题清单资源汇总/经验交流
五级真题解析五级练习题清单
六级真题解析六级练习题清单


CSP学习资源清单

CSP-XL
CSP-J
2025辽宁CSP-XL复赛真题解析CSP-J 真题解析
CSP-X 真题解析

NOI学习资源清单
NOIP
1998年真题解析‍‍
1999年真题解析
2000年真题解析
2001年真题解析‍‍
2008年真题解析
2011年真题解析

CSP-X 2018真题-11的倍数,一道结合字符串处理与数学整除性判定的题目,考察对大整数的按位处理以及模运算的应用。由于数据位数可达100位,需要用字符串代替整型变量来处理输入。适合GESP三级及以上考生练习,难度⭐⭐。

B4075 [CSP-X 2018] 11 的倍数

题目要求

题目描述

如何判断一个正整数  是不是  的倍数?

可以计算  所得的余数,如果余数等于 ,那么  是  的倍数。

还可以用下面的方法来判断:

把  的个位数字、十位数字、百位数字……相加,如果所得的和是  的倍数,那么  就是  的倍数。例如: 是  的倍数,那么  就是  的倍数。

接下来你的任务是,判断  是不是  的倍数。

有一个与判断是不是  的倍数类似的方法供你参考:

  • 把  的个位、百位、万位……上的数字求和,得 
  • 把  的十位、千位、十万位……上的数字求和,得 

如果  所得的余数  所得的余数,那么  就是  的倍数。

例如:。因为  余  也余 ,所以  是  的倍数。

输入格式

第一行,一个正整数 

以下  行,每行一个正整数 ,需要你判断  是不是  的倍数。

输出格式

 行,每行输出一个  或 ,表示  是不是  的倍数。

输入输出样例 #1

输入 #1
2035 62202 335 
输出 #1
YesNoNo

说明/提示

对于  的数据, 的位数不超过  位;

对于  的数据, 的位数不超过  位;

对于  的数据, 的位数不超过  位, 不超过 


题目分析

本题考察的核心是11 的整除性判定法则以及大整数的字符串处理。由于输入数字最多可达 100 位,远超 long long 的表示范围(约 18 位),因此必须以字符串形式读入并逐字符处理。

解题思路分析:

  1. 理解判定规则

    • 从个位(最右边)开始,按位置的奇偶性将数字分为两组:个位、百位、万位……求和得 ;十位、千位、十万位……求和得 
    • 若 ,则  是  的倍数。
    • 这本质上等价于判断  是否为  的倍数(即奇偶位数字交替和能被  整除)。
  2. 字符串处理

    • 将数字以字符串形式读入,字符串的最后一个字符对应个位。
    • 从字符串末尾向前遍历,按照当前位置与末尾的距离(即从右往左的第  位)判断奇偶,将对应数字分别累加到  或  中。
    • 字符转数字的方法:s[i] - '0'
  3. 最终判断

    • 计算  和 ,相等则输出 Yes,否则输出 No
    • 由于每位数字最大为 ,最多  位,所以  和  最大不超过 ,用 int 即可安全存储。

复杂度分析:

  • 时间复杂度:,其中  为数字的位数,最大为 
  • 空间复杂度:,用于存储输入的字符串。

示例代码

#include<iostream>#include<string>intmain(){    int n;    std::cin >> n;    while (n--) {        std::string x;        std::cin >> x;        int s1 = 0, s2 = 0;        int len = x.length();        // 从末尾(个位)向前遍历每一位数字        for (int i = len - 1; i >= 0; i--) {            // 计算当前位从右往左数的位置编号(个位为第0位)            int pos = len - 1 - i;            // 将字符转换为对应的数字            int digit = x[i] - '0';            if (pos % 2 == 0) {                // 偶数位(个位、百位、万位……)累加到 s1                s1 += digit;            } else {                // 奇数位(十位、千位、十万位……)累加到 s2                s2 += digit;            }        }        // 判断 s1 和 s2 对 11 取模是否相等        if (s1 % 11 == s2 % 11) {            std::cout << "Yes" << std::endl;        } else {            std::cout << "No" << std::endl;        }    }    return 0;}

【推荐】【GESP】C++ 认证学习资源汇总(2026年3月更新)

【推荐】GESP/CSP/NOI资料站https://wiki.coderli.com/

【推荐】GESP/CSP学习交流群

luogu-”系列题目可在洛谷题库进行在线评测。

bcqm-”系列题目可在编程启蒙题库进行在线评测。