1. 程式人生 > >51nod-【1042 數字0-9的數量】

51nod-【1042 數字0-9的數量】

 收藏  關注 給出一段區間a-b,統計這個區間內0-9出現的次數。 比如 10-19,1出現11次(10,11,12,13,14,15,16,17,18,19,其中11包括2個1),其餘數字各出現1次。 Input
兩個數a,b(1 <= a <= b <= 10^18)
Output
輸出共10行,分別是0-9出現的次數
Input示例
10 19
Output示例
1
11
1
1
1
1
1
1
1

1

如果是第一次接觸這樣的題目,推薦先看這個1009 數字1的數量 再次解釋一下,隨便舉個數 456 求2出現的次數 我們在這裡值分析百位的4  因為 4>2 把百位看成2,十位和個位有100種方案 然後百位可以取 0 1 2 3 這4個數,每個數對應有dp[2] 

#include<cstdio>
#include<cstring>
#include<cmath>
#define LL long long
LL dp[20]; 
void Init()
{
	memset(dp,0,sizeof(dp)); 
	int i;
	for(i=1;i<20;++i)
		dp[i]=dp[i-1]*10+pow(10,i-1);
}
LL solver(LL n,LL to)
{
	LL temp=1,tn=n,rail=0,result=0,digit=0;
	LL len=0;
	while(tn)
	{
		digit=tn%10;
		tn/=10;
		++len;
		if(to==digit)
		{
			result+=rail+1+digit*dp[len-1]; 
		} 
		else if(digit>to)
		{
			result+=digit*dp[len-1]+temp; 
		} 
		else if(digit<to) 
			result+=digit*dp[len-1]; 
		rail+=digit*temp;
		temp*=10;
	}
	if(to==0)
	{
		temp=1;
		while(n)
		{
			result-=temp;
			n/=10;
			temp*=10;
		} 
	}	 
	return result;
} 
int main()
{
	Init(); 
	LL a,b;
	while(scanf("%lld%lld",&a,&b)!=EOF)
	{
		LL i;
		for(i=0;i<=9;++i)
			printf("%lld\n",solver(b,i)-solver(a-1,i)); 
	} 
}