51nod 1042 数字0-9的数量
Posted starry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1042 数字0-9的数量相关的知识,希望对你有一定的参考价值。
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
计算[a,b]中0-9的次数。
1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #include <math.h> 5 #define ll long long 6 using namespace std; 7 8 ll dp[20]; 9 10 void init() { 11 memset(dp, 0, sizeof(dp)); 12 for(int i = 1; i <= 18; i ++) { 13 dp[i] = dp[i-1]*10 + pow(10,i-1); 14 } 15 } 16 ll count(ll r, int x) { 17 ll sum = 0, len = 0, cnt = 1, tail = 0, rr = r; 18 while(r) { 19 int tmp = r%10; 20 r /= 10; 21 len ++; 22 if(tmp > x) { 23 sum += dp[len-1]*tmp + cnt; 24 } else if(tmp == x) { 25 sum += dp[len-1]*tmp + tail + 1; 26 } else { 27 sum += dp[len-1]*tmp; 28 } 29 tail = tail + tmp*cnt; 30 cnt *= 10; 31 } 32 if(!x) { //是0的话就删除前缀为0的 33 ll ans = 1; 34 while(rr) { 35 sum -= ans; 36 ans *= 10; 37 rr /= 10; 38 } 39 } 40 return sum; 41 } 42 int main() { 43 init(); 44 ll a, b; 45 cin >> a >> b; 46 for(int i = 0; i < 10; i ++) { 47 cout << count(b,i) - count(a-1,i) << endl; 48 } 49 return 0; 50 }
以上是关于51nod 1042 数字0-9的数量的主要内容,如果未能解决你的问题,请参考以下文章
CodeVS 1359 数字计数 51nod 1042 数字0-9的数量 Pascal