C++代码解决数字计数问题
4星 · 超过85%的资源 需积分: 45 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`,即每个数字的出现次数。
这段代码使用了动态规划的思想,通过对页码的每一位进行分析,逐位计算出各个数字的出现次数,最终输出结果。这种方法简洁高效,能正确地处理任意位数的页码。
2020-07-17 上传
2013-04-07 上传
2009-04-27 上传
2010-10-08 上传
2023-10-11 上传
2023-06-10 上传
2023-06-08 上传
2013-08-08 上传
2022-10-04 上传
shaoyechen
- 粉丝: 0
- 资源: 1
最新资源
- 平尾装配工作平台运输支撑系统设计与应用
- MAX-MIN Ant System:用MATLAB解决旅行商问题
- Flutter状态管理新秀:sealed_flutter_bloc包整合seal_unions
- Pong²开源游戏:双人对战图形化的经典竞技体验
- jQuery spriteAnimator插件:创建精灵动画的利器
- 广播媒体对象传输方法与设备的技术分析
- MATLAB HDF5数据提取工具:深层结构化数据处理
- 适用于arm64的Valgrind交叉编译包发布
- 基于canvas和Java后端的小程序“飞翔的小鸟”完整示例
- 全面升级STM32F7 Discovery LCD BSP驱动程序
- React Router v4 入门教程与示例代码解析
- 下载OpenCV各版本安装包,全面覆盖2.4至4.5
- 手写笔画分割技术的新突破:智能分割方法与装置
- 基于Koplowitz & Bruckstein算法的MATLAB周长估计方法
- Modbus4j-3.0.3版本免费下载指南
- PoqetPresenter:Sharp Zaurus上的开源OpenOffice演示查看器