您的位置:首页 > 其它

统计数字问题

2014-02-22 21:13 225 查看
题目选自王晓东的《计算机算法设计与分析》。。为什么用这本书呢,因为这是我们的教材啊,哈哈哈。题目意思是这样的,输入一个数,统计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哥出现多少次。以此类推。比如输入的数是37851,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]);
}
代码是靠自己的理解写出来的,所以我觉得你要是理解了就不难写出来,光看是很难理解的。话说,妈的,我命名又各种不规范,真实欠揍!!!
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: