统计数字问题


参考资料:http://blog.csdn.net/jcwKyl/article/details/3009244

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

/*f(n)=10f(n-1)+10^(n-1)   推导出 f(n)=n*10^(n-1)*/

int main()
{
	int i,len,n,tempn,templen;
	int pow[10];
	int temp=1;
	int highNum;

	int count[10];

	memset(count,0,sizeof(count));

	for(i=0;i<10;i++)//用于计算pow
	{
		pow[i]=temp;
		temp=temp*10;
	}


	scanf("%d",&n);

	i=1;
	len=1;

	while(n>=pow[i])
	{
		len++;
		i++;
	}

	tempn=n;
	templen=len;

	while(templen>1)
	{
		highNum=tempn/pow[templen-1];
		for(i=0;i<10;i++)
		{
			count[i]+=highNum*(templen-1)*pow[templen-2];//算出除了最高位时已经出现的次数,如n=34567时,那么在00000--29999时出现了3个 4*10^(3)
		}

		for(i=0;i<highNum;i++)//算最高位 0 1 2出现的次数
		{
			count[i]+=pow[templen-1];
		}
		
		tempn=tempn%pow[templen-1];//算出除了最高位剩下的数

		count[highNum] += tempn+1;//最高位3出现的次数

		templen--;
		
	}

	for(i=0;i<=tempn;i++)
	{
		count[i]++;
		
	}

	//去前导的0
	for(i=0;i<len;i++)
	{
		count[0] -= pow[i];
	}

	for(i=0;i<10;i++)
	{
		printf("%d\n",count[i]);

	}	

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值