1-1 统计数字问题
问题描述: 一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编辑,每个页码不含多余的前导数字0。例如,第6页用数字6表示而不是06或006等。数字计数问题要求对给定书的总页码n,计算书的全部页码分别用到多少次数字0、1、2、…、9。
算法设计: 给定表示书的总页码的十进制整数$n(1 \leq n \leq 10^9)$,计算书的全部页码中分别用到多少次数字0、1、2、…、9。
数据输入: 输入数据由文件名为 input.txt 的文本文件提供。每个文件只有1行,给出表示书的总页码的整数n。
结果输出: 将计算结果输出到文件 output.txt。输出文件共10行,在第k行(k=1,2,…,10)输出页码中用到数字k−1 的次数。


#include<iostream>
#include<cmath>
using namespace std;
int n;//页码数
int a[10]={0};//统计数字个数
//method 1: 逐个数字统计
// void count(int x){//统计数字个数
// int num=x;
// while(num>0){
// a[num%10]++;
// num/=10;
// }
// }
//method 2:递归方式
int countNum(int n){//计算所有n位数中各数个数
if(n==0){
return 0;
}
return n*(int)pow(10,n-1);
}
int getDigitCount(int num){//获取数字位数
int count=0;
count=(int)log10(num)+1;
return count;
}
void count(int n,int digitCount){//开始递归处理,从高位到低位,n为待统计数字,digitCount为数字位数
if(digitCount==1){//如果数字位数为1,则直接统计数字个数
for(int i=0;i<=n;i++){
a[i]++;
}
return;
}
int highDigit=n/(int)pow(10,digitCount-1);//获取高位数字,表示由几组digitCount-1位数字组成
int rest=n%(int)pow(10,digitCount-1);//获取剩余数字,用于之后的递归处理
for(int i=0;i<=9;i++){//处理digitCount-1位
a[i]+=highDigit*countNum(digitCount-1);
}
for(int i=0;i<highDigit;i++){//处理最高位,前highDigit-1位由digitCount-1位数字组成,最后一位由rest+1个数字组成
a[i]+=(int)pow(10,digitCount-1);
}
a[highDigit]+=rest+1;
count(rest,digitCount-1);//递归处理剩余数字
}
void subZero(int digitCount){//处理多出来的0
for(int i=0;i<digitCount;i++){
a[0]-=(int)pow(10,i);
}
}
int main(){
cin>>n;
//method 1
// for (int i=1;i<=n;i++){
// count(i);
// }
//method 2
int digitCount=getDigitCount(n);
count(n,digitCount);
subZero(digitCount);
for (int i=0;i<10;i++){
cout<<i<<" "<<a[i]<<endl;
}
}

最新评论