算法设计与分析-1-页码统计

本文介绍了一种用于计算一本书所有页码中各个数字0至9出现次数的算法。通过分析不同数量级下数字出现的规律,设计了一套计算流程,能够有效解决给定页码总数时各数字出现频率的问题。
一本书的页码从自然数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]);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值