统计数字问题

来源:互联网 发布:网络整合营销案例 编辑:程序博客网 时间:2024/06/13 20:27

题目选自王晓东的《计算机算法设计与分析》。。为什么用这本书呢,因为这是我们的教材啊,哈哈哈。

题目意思是这样的,输入一个数,统计1到这个数中,0-9出现的个数;

这个题的直觉是用暴力法,一个一个数循环,进行统计各个位数中数字出现的次数。

然后我写了这个暴力法:

#include<stdio.h>void process_number(int* a,int num){int x;while(num>0){x = num%10;a[x]++;num/=10;}}int main(){int a[10] = {0};int number,i;scanf("%d",&number);for(i=1;i<=number;i++)process_number(a,i);for(i=0;i<10;i++)printf("%d\n",a[i]);}

给跪了,题目要求数字达到10^9,可是我到10^8就等了半天。显然这个方法不可取。

其实只要自己手上写写,就会发现这个是有规律可寻的。下面是我找到的规律。

如果我是这样计数的话,一开始统计1-n个位数上1-9各出现多少次。十位上1-9哥出现多少次。以此类推。比如输入的数是3785

1,2...,9,10;11,12,...,,20;21,,,,,3780,3781,3785;这样会发现,0-9,我可以先加个378,然后0-5再各加以此。

接着统计十位,我还是照上面的写法,但是请注意,我现在每写一个1表示十位上1出现10次,如果我写了12,表示十位上2出现了10次,因此我可以像统计个位一样

统计十位,但是此时权重是10.BUT,当我写378的时候8没有出现10次,而是出现6次,所以这个要特殊考虑。

下面是代码

#include<stdio.h>int main(){int count[10]={0};int num,ori,t=1,p,i,k,ort;scanf("%d",&num);ori = num;ort = num;num = (num+1)*10;while((num/10-1)>0){num = num/10-1;k = num%10;if(k>0)for(i=1;i<=k;i++)count[i]+=t;p = num/10;for(i=0;i<=9;i++)count[i]+=t*p;t=t*10;if(ort/10>0){count[(ort/10)%10]+=ori%t+1;ort=ort/10;}}for(i=0;i<=9;i++)printf("%d\n",count[i]);}

代码是靠自己的理解写出来的,所以我觉得你要是理解了就不难写出来,光看是很难理解的。

话说,妈的,我命名又各种不规范,真实欠揍!!!


0 0
原创粉丝点击