day21--梦境数数--2.25
习题概述
题目背景
Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。
题目描述
Bessie 的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码(0…9):每一个数码在计数的过程中出现过多少次?
给出两个整数 M 和 N,求在序列 [M,M+1,M+2,…,N−1,N] 中每一个数码出现了多少次。
输入格式
第 1 行: 两个用空格分开的整数 M 和 N。
输出格式
第 1 行: 十个用空格分开的整数,分别表示数码 0…9 在序列中出现的次数。
代码表示
#include<bits/stdc++.h>using namespace std;int main() { int M, N; cin >> M >> N;//创建了一个长度为 10 的整型数组 count//用于存储每个数字(0 到 9)在序列中出现的次数 int count[10] = {0}; for (int i = M; i <= N; i++) { int num = i; while (num > 0) { count[num % 10]++; // 获取 num 的最后一位数,之后再对应加1 num /= 10;//将 num 的最后一位数字去除 } } for (int i = 0; i < 10; i++) { cout << count[i];//输出当前数字出现的次数 if (i < 9) { cout << " "; } } cout << endl; return 0;}
心得体会
1. int count[10] = {0};
for (int i = M; i <= N; i++) {
int num = i;
while (num > 0) {
count[num % 10]++;
num /= 10;
当我们遍历从 M
到 N
的每一个数字时,可以写在一个循环中,我们需要对每个数字的每一位进行统计。这段代码使用了一个嵌套的 for
循环和 while
循环来实现。
外层的 for
循环会依次将 M
到 N
之间的每个数字赋值给变量 i
。这个变量 i
就代表当前正在处理的数字。在内层的 while
循环中,我们首先将当前数字 i
复制给另一个变量 num
,以便进行处理。
使用 num % 10
取模运算,获取 num
的最后一位数字。这是通过对 num
取余数来实现的。例如,当 num
是 1234 时,num % 10
的结果就是 4。
使用 count[num % 10]++
将 num
的最后一位数字作为索引,将 count
数组中相应位置的元素加1。这样就实现了对该数字的出现次数进行统计。
通过 num /= 10
将 num
的最后一位数字去除,以便处理下一位数字。这是通过整除运算来实现的。例如,当 num
是 1234 时,num /= 10
的结果就是 123。
通过不断重复这个过程,我们可以逐位统计每个数字在当前数字 i
中的出现次数,直到 num
不再大于 0。这样,内层的 while
循环会处理完当前数字 i
的所有位数,并将统计结果记录在 count
数组中。然后,外层的 for
循环会继续处理下一个数字,直到遍历完从 M
到 N
的所有数字。
2. 整体代码可以这样理解
这段C++代码的主要目标是统计在给定序列 [M, M+1, M+2, ..., N-1, N]
中每个数字(0到9)出现的次数。它的实现过程可以总结如下:
1)声明两个整数类型的变量 M
和 N
,并从输入中读取它们的值。
2)创建一个长度为10的整型数组 count
,用于存储每个数字在序列中出现的次数,并将数组的所有元素初始化为0。
3)使用一个循环遍历从 M
到 N
的所有数字。
4)在循环内部,使用取模运算获取当前数字的最后一位,并将对应位置的 count
数组元素加1,以统计该数字的出现次数。然后通过整除运算去除当前数字的最后一位,以便处理下一位数字。
5)使用另一个循环遍历 count
数组中的所有元素,输出每个数字的出现次数。同时,在输出之间添加空格进行分隔。
6)最后,输出一个换行符以确保输出结果的格式正确。
7)程序正常结束并返回值为0。