返回 课程

信奥AC之路-2级

0% 完成
0/0 步骤
  1. 第一课:字符
    5 主题|小节
  2. 第二课 嵌套循环与矩形图案(一)
    4 主题|小节
  3. 第三课 嵌套循环与矩形图案(二)
    3 主题|小节
  4. 第四课:矩形三
    5 主题|小节
  5. 第五课:字符矩形
    7 主题|小节
  6. 第六课:直角三角形
    6 主题|小节
  7. 第七课:倒三角形
    7 主题|小节
  8. 第八课:字符三角形
    8 主题|小节
  9. 第九课:字符倒三角形
    7 主题|小节
  10. 第十课:平行四边形
    6 主题|小节
  11. 第十一课:字符直角三角形
    5 主题|小节
  12. 第十二课:左斜三角形
    6 主题|小节
  13. 第十三课:等腰三角形
    6 主题|小节
  14. 第十四课:倒置等腰三角形
    7 主题|小节
  15. 第十五课:上下对称图形
    4 主题|小节
  16. 第十六课:复杂对称图形
    5 主题|小节
  17. 第十七课:左右对称图形
    5 主题|小节
  18. 第十八课:空心图形
    5 主题|小节
  19. 第十九课:空心图形
    3 主题|小节
  20. 第二十课:嵌套应用
    4 主题|小节
  21. 第二十一课:嵌套应用二
    4 主题|小节
  22. 第二十二课:嵌套应用三
    3 主题|小节
  23. 第二十三课:嵌套应用四
    3 主题|小节
课 21, 主题|小节 2
进行中

21.2 数字处理问题

2025年12月1日
课 进展
0% 完成

“在编程中,我们经常需要处理和分析数字的各个位,”我解释道,”通过循环和取模运算,我们可以轻松地访问和操作数字的每一位。”

21.2.1 统计零的个数

题目描述:统计正整数a到b之间有多少个数字0。

样例输入

1 100

样例输出

11

代码实现

#include <iostream>
using namespace std;

int main() {
    int a, b, cnt = 0;  // a为起始值,b为结束值,cnt为数字0的计数器
    cin >> a >> b;
    for(int i = a; i <= b; i++) {  // 外循环遍历从a到b的每个数
        int t = i;  // 用临时变量t存储当前数字,避免修改i
        while(t) {  // 当t不为0时循环继续
            int g = t % 10;  // 获取t的最后一位数字
            if(g == 0) {  // 如果最后一位是0
                cnt++;  // 计数器加1
            }
            t /= 10;  // 去掉t的最后一位,继续处理前面的位
        }
    }
    cout << cnt;  // 输出0的总数
    return 0;
}

思考

  • 外循环遍历从a到b的每个数
  • 内层while循环用于分解每个数的各位
  • 使用取模运算(t % 10)获取最后一位数字
  • 使用整除运算(t /= 10)去掉最后一位
  • 如果最后一位是0,计数器加1

21.2.2 计数特定数字

题目描述:小杨认为自己的幸运数是正整数k(注:保证1≤k≤9)。小杨想知道,对于从1到n的所有正整数中,k出现了多少次。

样例输入

20 2

样例输出

2

代码实现

#include <iostream>
using namespace std;

int main() {
    int n, k, cnt = 0;  // n为范围上限,k为要统计的数字,cnt为k出现的次数
    cin >> n >> k;
    for(int i = 1; i <= n; i++) {  // 外循环遍历1到n的每个数
        int t = i;  // 用临时变量t存储当前数字
        while(t) {  // 当t不为0时循环继续
            int g = t % 10;  // 获取t的最后一位数字
            if(g == k) {  // 如果最后一位等于k
                cnt++;  // 计数器加1
            }
            t /= 10;  // 去掉t的最后一位,继续处理前面的位
        }
    }
    cout << cnt;  // 输出k出现的总次数
    return 0;
}

思考

  • 该实验与实验三类似,只是将判断条件从g==0改为g==k
  • 该方法可以统计任意数字在指定范围内出现的次数
  • 可以尝试思考更高效的解法,特别是当n很大时

21.2.3 数位之和

题目描述:小杨有n个正整数,他认为一个正整数是美丽数字当且仅当该正整数每一位数字的总和是7的倍数。小杨想请你编写一个程序判断n个正整数哪些是美丽数字。

样例输入

3
14
7
22

样例输出

Yes
Yes
No

代码实现

#include <iostream>
using namespace std;

int main() {
    int n;  // n表示要处理的数字个数
    cin >> n;
    while(n--) {  // 循环处理n个数字,每次n减1
        int x;  // 当前要处理的数字
        cin >> x;
        int sum = 0;  // 初始化数位之和为0
        while(x) {  // 当x不为0时循环继续
            int g = x % 10;  // 获取x的最后一位数字
            sum += g;  // 将该位数字加入总和
            x /= 10;  // 去掉x的最后一位,继续处理前面的位
        }
        cout << (sum % 7 ? "No" : "Yes") << endl;  // 判断数位之和是否为7的倍数,是则输出Yes,否则输出No
    }
    return 0;
}

思考

  • 外循环遍历n个输入数字
  • 内层while循环计算每个数字的各位之和
  • 使用三元运算符判断各位之和是否为7的倍数
  • 该题展示了如何处理多组输入数据