一本书的页码从自然数1开始顺序编码直到自然数N。数的野马按照通常的习惯编排,每个页码都不含多余的前导数字0,
例如第6页用数字6表示,而不是06,数字计数问题要求对给定数的总页码n计算出书的全部页码中分别用到多少次数字
0,1,2...9
算法设计 给定的表示数的总页码的十进制数n(1<= n <= 10^9)计算数的全部页码中分别用到多少次数字0,1,2...9
思路:
规律,对于页码n,当n小于10时0出现0次,1-9出现1次;
100时0出现9 1-9出现20;
1000时 0出现189次 1-9 300次;
。。。。
其中有规律吗?
对于n小于100,1出现的次数是10(个位次数1.11.21.31...91)+1*10(十位次数10.11.12...19)
对于n小于1000呢,1出现次数是百位100(百位次数100.101.102...199)+20(1-99中1出现次数)+20(101-199不计百位)+。。。20(901-999)=100+20*10=300
所以n小于10000呢,次数千位1000+300(1-999)+300(1001-1999)+。。。=1000+300*10=4000
10000+4000*10=50000;
。。。。。
对于1-9均和1类似。
零很特殊,因为00不计(计的话类似11,22,33)01计1,故
对于n小于100,0出现仅9次,少了十位十次和个位一次即00.01.02...09十1个数
对于N小于1000,0在1-99(9次)和100-199(200-299/300-399/..900-999)(20次)不同,并无百位出现的,也就是无最高位出现次数。
-----------------------------------------------------------------------------------------------------
#include<stdio.h>
#include<math.h>
void main()
{
int l,k,index,time,ary_inf[9][2],aim,ary_out[10],ary_in_n[10],ary_in_t[10],int1,int2,m=0,int3;
ary_inf[0][0]=0;
ary_inf[0][1]=1;
for(time=1;time<9;time++)
{
ary_inf[time][0]=ary_inf[time-1][1]*9+ary_inf[time-1][0];
ary_inf[time][1]=(int)(ary_inf[time-1][1]*10+pow(10,time));
printf("%d %d\n",ary_inf[time][0],ary_inf[time][1]);
}
scanf("%d",&aim);
for(k=0;k<=9;k++)
{
ary_out[k]=0;
ary_in_n[k]=0;
}
for(index=9;index>=1;index--)
{
if(aim>=pow(10,index)&&m==0){
m=index;
}
if(aim>=pow(10,index))
{
ary_in_n[index]=(aim/(int)pow(10,index));
ary_in_t[index]=aim%(int)pow(10,index)+1;
if(m!=index)
{
for(int3=0;int3<ary_in_n[index];int3++)
ary_out[int3]+=(int)pow(10,index);
}
else{
for(int3=1;int3<ary_in_n[index];int3++)
ary_out[int3]+=(int)pow(10,index);
}
ary_out[ary_in_n[index]]+=ary_in_t[index];
if(ary_in_n[index]==1)
{
ary_out[0]+=ary_inf[index-1][0];
ary_out[1]+=ary_inf[index-1][1];
ary_out[2]+=ary_inf[index-1][1];
ary_out[3]+=ary_inf[index-1][1];
ary_out[4]+=ary_inf[index-1][1];
ary_out[5]+=ary_inf[index-1][1];
ary_out[6]+=ary_inf[index-1][1];
ary_out[7]+=ary_inf[index-1][1];
ary_out[8]+=ary_inf[index-1][1];
ary_out[9]+=ary_inf[index-1][1];
}
if(ary_in_n[index]==2)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1];
ary_out[1]+=ary_inf[index-1][1]*2;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*2;
ary_out[3]+=ary_inf[index-1][1]*2;
ary_out[4]+=ary_inf[index-1][1]*2;
ary_out[5]+=ary_inf[index-1][1]*2;
ary_out[6]+=ary_inf[index-1][1]*2;
ary_out[7]+=ary_inf[index-1][1]*2;
ary_out[8]+=ary_inf[index-1][1]*2;
ary_out[9]+=ary_inf[index-1][1]*2;
}
if(ary_in_n[index]==3)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*2;
ary_out[1]+=ary_inf[index-1][1]*3;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*3;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*3;
ary_out[4]+=ary_inf[index-1][1]*3;
ary_out[5]+=ary_inf[index-1][1]*3;
ary_out[6]+=ary_inf[index-1][1]*3;
ary_out[7]+=ary_inf[index-1][1]*3;
ary_out[8]+=ary_inf[index-1][1]*3;
ary_out[9]+=ary_inf[index-1][1]*3;
}
if(ary_in_n[index]==4)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*3;
ary_out[1]+=ary_inf[index-1][1]*4;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*4;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*4;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*4;
ary_out[5]+=ary_inf[index-1][1]*4;
ary_out[6]+=ary_inf[index-1][1]*4;
ary_out[7]+=ary_inf[index-1][1]*4;
ary_out[8]+=ary_inf[index-1][1]*4;
ary_out[9]+=ary_inf[index-1][1]*4;
}
if(ary_in_n[index]==5)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*4;
ary_out[1]+=ary_inf[index-1][1]*5;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*5;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*5;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*5;//+(int)pow(10,index);
ary_out[5]+=ary_inf[index-1][1]*5;
ary_out[6]+=ary_inf[index-1][1]*5;
ary_out[7]+=ary_inf[index-1][1]*5;
ary_out[8]+=ary_inf[index-1][1]*5;
ary_out[9]+=ary_inf[index-1][1]*5;
}
if(ary_in_n[index]==6)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*5;
ary_out[1]+=ary_inf[index-1][1]*6;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*6;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*6;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*6;//+(int)pow(10,index);
ary_out[5]+=ary_inf[index-1][1]*6;//+(int)pow(10,index);
ary_out[6]+=ary_inf[index-1][1]*6;
ary_out[7]+=ary_inf[index-1][1]*6;
ary_out[8]+=ary_inf[index-1][1]*6;
ary_out[9]+=ary_inf[index-1][1]*6;
}
if(ary_in_n[index]==7)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*6;
ary_out[1]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[5]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[6]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[7]+=ary_inf[index-1][1]*7;
ary_out[8]+=ary_inf[index-1][1]*7;
ary_out[9]+=ary_inf[index-1][1]*7;
}
if(ary_in_n[index]==8)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*7;
ary_out[1]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[5]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[6]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[7]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[8]+=ary_inf[index-1][1]*8;
ary_out[9]+=ary_inf[index-1][1]*8;
}
if(ary_in_n[index]==9)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*8;
ary_out[1]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[5]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[6]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[7]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[8]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[9]+=ary_inf[index-1][1]*9;
}
if(m!=index)
{
ary_out[0]=ary_out[0]-ary_inf[index-1][0]+ary_inf[index-1][1];
}
}
else if(m>0)
{
ary_in_n[index]=(aim/(int)pow(10,index));
ary_in_t[index]=aim%(int)pow(10,index)+1;
ary_out[ary_in_n[index]]+=ary_in_t[index];
}
aim=aim%(int)pow(10,index);
}
for(int2=0;int2<10;int2++)
{
if(int2<=aim&&(m!=0||int2>0))
ary_out[int2]++;
printf("%d\n",ary_out[int2]);
}
}
例如第6页用数字6表示,而不是06,数字计数问题要求对给定数的总页码n计算出书的全部页码中分别用到多少次数字
0,1,2...9
算法设计 给定的表示数的总页码的十进制数n(1<= n <= 10^9)计算数的全部页码中分别用到多少次数字0,1,2...9
思路:
规律,对于页码n,当n小于10时0出现0次,1-9出现1次;
100时0出现9 1-9出现20;
1000时 0出现189次 1-9 300次;
。。。。
其中有规律吗?
对于n小于100,1出现的次数是10(个位次数1.11.21.31...91)+1*10(十位次数10.11.12...19)
对于n小于1000呢,1出现次数是百位100(百位次数100.101.102...199)+20(1-99中1出现次数)+20(101-199不计百位)+。。。20(901-999)=100+20*10=300
所以n小于10000呢,次数千位1000+300(1-999)+300(1001-1999)+。。。=1000+300*10=4000
10000+4000*10=50000;
。。。。。
对于1-9均和1类似。
零很特殊,因为00不计(计的话类似11,22,33)01计1,故
对于n小于100,0出现仅9次,少了十位十次和个位一次即00.01.02...09十1个数
对于N小于1000,0在1-99(9次)和100-199(200-299/300-399/..900-999)(20次)不同,并无百位出现的,也就是无最高位出现次数。
-----------------------------------------------------------------------------------------------------
#include<stdio.h>
#include<math.h>
void main()
{
int l,k,index,time,ary_inf[9][2],aim,ary_out[10],ary_in_n[10],ary_in_t[10],int1,int2,m=0,int3;
ary_inf[0][0]=0;
ary_inf[0][1]=1;
for(time=1;time<9;time++)
{
ary_inf[time][0]=ary_inf[time-1][1]*9+ary_inf[time-1][0];
ary_inf[time][1]=(int)(ary_inf[time-1][1]*10+pow(10,time));
printf("%d %d\n",ary_inf[time][0],ary_inf[time][1]);
}
scanf("%d",&aim);
for(k=0;k<=9;k++)
{
ary_out[k]=0;
ary_in_n[k]=0;
}
for(index=9;index>=1;index--)
{
if(aim>=pow(10,index)&&m==0){
m=index;
}
if(aim>=pow(10,index))
{
ary_in_n[index]=(aim/(int)pow(10,index));
ary_in_t[index]=aim%(int)pow(10,index)+1;
if(m!=index)
{
for(int3=0;int3<ary_in_n[index];int3++)
ary_out[int3]+=(int)pow(10,index);
}
else{
for(int3=1;int3<ary_in_n[index];int3++)
ary_out[int3]+=(int)pow(10,index);
}
ary_out[ary_in_n[index]]+=ary_in_t[index];
if(ary_in_n[index]==1)
{
ary_out[0]+=ary_inf[index-1][0];
ary_out[1]+=ary_inf[index-1][1];
ary_out[2]+=ary_inf[index-1][1];
ary_out[3]+=ary_inf[index-1][1];
ary_out[4]+=ary_inf[index-1][1];
ary_out[5]+=ary_inf[index-1][1];
ary_out[6]+=ary_inf[index-1][1];
ary_out[7]+=ary_inf[index-1][1];
ary_out[8]+=ary_inf[index-1][1];
ary_out[9]+=ary_inf[index-1][1];
}
if(ary_in_n[index]==2)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1];
ary_out[1]+=ary_inf[index-1][1]*2;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*2;
ary_out[3]+=ary_inf[index-1][1]*2;
ary_out[4]+=ary_inf[index-1][1]*2;
ary_out[5]+=ary_inf[index-1][1]*2;
ary_out[6]+=ary_inf[index-1][1]*2;
ary_out[7]+=ary_inf[index-1][1]*2;
ary_out[8]+=ary_inf[index-1][1]*2;
ary_out[9]+=ary_inf[index-1][1]*2;
}
if(ary_in_n[index]==3)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*2;
ary_out[1]+=ary_inf[index-1][1]*3;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*3;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*3;
ary_out[4]+=ary_inf[index-1][1]*3;
ary_out[5]+=ary_inf[index-1][1]*3;
ary_out[6]+=ary_inf[index-1][1]*3;
ary_out[7]+=ary_inf[index-1][1]*3;
ary_out[8]+=ary_inf[index-1][1]*3;
ary_out[9]+=ary_inf[index-1][1]*3;
}
if(ary_in_n[index]==4)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*3;
ary_out[1]+=ary_inf[index-1][1]*4;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*4;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*4;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*4;
ary_out[5]+=ary_inf[index-1][1]*4;
ary_out[6]+=ary_inf[index-1][1]*4;
ary_out[7]+=ary_inf[index-1][1]*4;
ary_out[8]+=ary_inf[index-1][1]*4;
ary_out[9]+=ary_inf[index-1][1]*4;
}
if(ary_in_n[index]==5)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*4;
ary_out[1]+=ary_inf[index-1][1]*5;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*5;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*5;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*5;//+(int)pow(10,index);
ary_out[5]+=ary_inf[index-1][1]*5;
ary_out[6]+=ary_inf[index-1][1]*5;
ary_out[7]+=ary_inf[index-1][1]*5;
ary_out[8]+=ary_inf[index-1][1]*5;
ary_out[9]+=ary_inf[index-1][1]*5;
}
if(ary_in_n[index]==6)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*5;
ary_out[1]+=ary_inf[index-1][1]*6;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*6;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*6;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*6;//+(int)pow(10,index);
ary_out[5]+=ary_inf[index-1][1]*6;//+(int)pow(10,index);
ary_out[6]+=ary_inf[index-1][1]*6;
ary_out[7]+=ary_inf[index-1][1]*6;
ary_out[8]+=ary_inf[index-1][1]*6;
ary_out[9]+=ary_inf[index-1][1]*6;
}
if(ary_in_n[index]==7)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*6;
ary_out[1]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[5]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[6]+=ary_inf[index-1][1]*7;//+(int)pow(10,index);
ary_out[7]+=ary_inf[index-1][1]*7;
ary_out[8]+=ary_inf[index-1][1]*7;
ary_out[9]+=ary_inf[index-1][1]*7;
}
if(ary_in_n[index]==8)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*7;
ary_out[1]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[5]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[6]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[7]+=ary_inf[index-1][1]*8;//+(int)pow(10,index);
ary_out[8]+=ary_inf[index-1][1]*8;
ary_out[9]+=ary_inf[index-1][1]*8;
}
if(ary_in_n[index]==9)
{
ary_out[0]+=ary_inf[index-1][0]+ary_inf[index-1][1]*8;
ary_out[1]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[2]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[3]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[4]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[5]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[6]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[7]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[8]+=ary_inf[index-1][1]*9;//+(int)pow(10,index);
ary_out[9]+=ary_inf[index-1][1]*9;
}
if(m!=index)
{
ary_out[0]=ary_out[0]-ary_inf[index-1][0]+ary_inf[index-1][1];
}
}
else if(m>0)
{
ary_in_n[index]=(aim/(int)pow(10,index));
ary_in_t[index]=aim%(int)pow(10,index)+1;
ary_out[ary_in_n[index]]+=ary_in_t[index];
}
aim=aim%(int)pow(10,index);
}
for(int2=0;int2<10;int2++)
{
if(int2<=aim&&(m!=0||int2>0))
ary_out[int2]++;
printf("%d\n",ary_out[int2]);
}
}