51nod-【1042 數字0-9的數量】
阿新 • • 發佈:2019-02-14
收藏
關注
給出一段區間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 19Output示例
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)); } }