C++代码解决数字计数问题

4星 · 超过85%的资源 需积分: 45 32 下载量 192 浏览量 更新于2024-10-13 1 收藏 1024B TXT 举报
"C++代码实现统计数字在书页码中的使用次数" 在这个问题中,我们需要计算从1到给定页码n的所有页码中,每一位数字0到9出现的次数。给定的页码n不会包含多余的前导0。这个问题可以分为多个步骤来解决,以下是对代码的详细解释: 首先,引入必要的头文件并声明变量: ```cpp #include<iostream> #include<math.h> using namespace std; ``` 这里包含了`iostream`用于输入输出,`math.h`用于数学计算,`using namespace std`使得我们可以直接使用`cin`和`cout`等标准库函数。 接着,定义主函数`main()`: ```cpp int main() { long num, temp, a[10] = {0}; int i, j, k, w, x[10], y[10]; cin >> num; w = 0; // λ 表示页码的位数 temp = num; // 计算页码的位数w while (temp) { w++; temp /= 10; } // 计算页码的最高位x[0]和最低位y[0] temp = num; x[0] = temp / pow(10, w - 1); y[0] = temp - x[0] * pow(10, w - 1) + 1; // 初始化数组a,用于存储各个数字出现的次数 for (j = 1; j < x[0]; j++) a[j] += pow(10, w - 1); a[j] += y[0]; // n位数的最后一位次数 // 处理中间的位数 for (i = w - 2, k = 0; i > 0; i--, k++) { x[k + 1] = temp / pow(10, i); y[k + 1] = temp - x[k + 1] * pow(10, i) + 1; // 更新对应位置的数字次数 for (j = 0; j < x[k + 1] - x[k] * 10 + 1; j++) a[j] += (x[k] + 1) * pow(10, i); a[0] -= pow(10, i); a[j - 1] = a[j - 1] - pow(10, i) + y[k + 1]; for (; j < 10; j++) a[j] += x[k] * pow(10, i); } // 如果页码不是一位数,处理最后一位 if (w != 1) { for (j = 0; j < y[k]; j++) a[j] += x[k] + 1; for (; j < 10; j++) a[j] += x[k]; a[0]--; } // 输出结果 for (j = 0; j < 10; j++) cout << a[j] << endl; return 0; } ``` 代码的主要逻辑如下: 1. 计算页码的位数`w`:通过不断除以10,直到商为0,得到的`w`就是页码的位数。 2. 初始化一个长度为10的数组`a`,用于记录每个数字0到9的出现次数,所有元素初始化为0。 3. 计算最高位`x[0]`和最低位`y[0]`,`x[0]`是页码的百位、十位或个位(取决于页码的位数),`y[0]`是最低位的数字。 4. 对于不是最高位的其他位,遍历并更新数组`a`,根据当前位的范围计算每个数字的出现次数。 5. 如果页码是多位数,需要单独处理最低位,更新对应的`a`数组元素。 6. 最后,输出数组`a`,即每个数字的出现次数。 这段代码使用了动态规划的思想,通过对页码的每一位进行分析,逐位计算出各个数字的出现次数,最终输出结果。这种方法简洁高效,能正确地处理任意位数的页码。