统计数字问题

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

题目意思是这样的,输入一个数,统计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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值