c++<统计数字问题>代码
根据题目要求,我们需要编写一个C++程序来解决一个有趣的问题:计算一本书的所有页码中,数字0至9各自出现的次数。这个问题的核心在于理解和运用数字出现规律与算法设计技巧。下面我们将对该问题进行详细的解析,并解释给定代码的主要逻辑。 ### 问题分析 #### 问题背景 对于任何一本书,其页码是从1开始递增到n的一个连续序列。例如,如果一本书有100页,则其页码序列为1, 2, 3, …, 100。在这个问题中,我们需要计算从1到n的所有页码中,数字0至9分别出现了多少次。 #### 输入输出格式 - **输入**:一个正整数n(1 ≤ n ≤ 10^9),表示书的页数。 - **输出**:10个整数,分别表示0至9这十个数字在所有页码中出现的次数。 ### 解决方案 为了有效地解决该问题,我们可以采取如下的步骤: 1. **计算n的位数**:首先确定n有多少位,这可以通过不断地除以10并计数来实现。 2. **分析每一位上的数字出现规律**:通过对每一位数字的观察,可以发现某些规律,这些规律可以帮助我们计算数字的出现次数。 3. **分段计算数字出现次数**:根据数字的位数,可以将问题分解为多个较小的子问题,每个子问题都可以独立计算特定数字的出现次数。 ### 代码解析 接下来,我们详细分析给定的C++代码: 1. **初始化变量**: - `long num`:表示书的总页码。 - `int a[10] = {0}`:用于存储0至9各数字出现的次数。 - `int x[10], y[10]`:辅助数组,用于存储当前处理位的值和剩余部分。 - `int w`:表示n的位数。 2. **计算n的位数**: ```cpp while(temp) { w++; temp /= 10; } ``` 通过不断地除以10并计数,直到temp为0,即可得到n的位数。 3. **处理最高位**: - `x[0] = temp / pow(10, w - 1)`:计算最高位的值。 - `y[0] = temp - x[0] * pow(10, w - 1) + 1`:计算剩余部分。 4. **逐位处理**: - 对于每一位,根据当前位的值以及前面各位的情况更新a数组。 - `for (j = 0; j < x[k + 1] - x[k] * 10 + 1; j++)`:计算当前位上数字的出现次数。 - `a[j] += (x[k] + 1) * pow(10, i);`:更新a数组中的计数。 - `a[0] -= pow(10, i);`:特殊处理数字0的出现情况。 - `a[j - 1] = a[j - 1] - pow(10, i) + y[k + 1];`:修正计数。 - `for (; j < 10; j++)`:处理剩余数字的出现次数。 5. **处理最后一位**: 如果w不等于1,则需要特别处理最后一位上的数字出现情况。 - `for (j = 0; j < y[k]; j++)`:计算最后一位上数字的出现次数。 - `a[j] += x[k] + 1;` - `for (; j < 10; j++)`:处理剩余数字的出现次数。 6. **输出结果**: ```cpp for (j = 0; j < 10; j++) cout << a[j] << endl; ``` 最后输出各个数字出现的次数。 通过以上步骤,我们可以有效地解决该问题。此方法不仅考虑了数字出现的一般规律,还巧妙地利用了数学方法简化了计算过程,是一种较为高效且易于理解的解决方案。
#include <math.h>
using namespace std;
int main()
{
long num,temp,a[10]={0};
int i,j,k,w,x[10],y[10];
cin>>num;
w=0; //位数
temp=num;
while(temp)
{
w++;
temp/=10;
} //计算出n是几位数
temp=num;
x[0]=temp/pow(10,w-1); //n的首位数字
y[0]=temp-x[0]*pow(10,w-1)+1; //首位数字开头的树有多少个
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];
- zuoyangguo5202013-02-27程序不错,注释一详细,能够编译通过
- xuan_02182014-06-28编译没通过。。。
- qiheizhihuo22011-11-27程序不错,但到提交到oj上,还是不能通过
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 适用于 Android、Java 和 Kotlin Multiplatform 的现代 I,O 库 .zip
- 高通TWS蓝牙规格书,做HIFI级别的耳机用
- Qt读写Usb设备的数据
- 这个存储库适合初学者从 Scratch 开始学习 JavaScript.zip
- AUTOSAR 4.4.0版本Rte模块标准文档
- 25考研冲刺快速复习经验.pptx
- MATLAB使用教程-初步入门大全
- 该存储库旨在为 Web 上的语言提供新信息 .zip
- 考研冲刺的实用经验与技巧.pptx
- Nvidia GeForce GT 1030-GeForce Studio For Win10&Win11(Win10&Win11 GeForce GT 1030显卡驱动)