码迷,mamicode.com
首页 > 其他好文 > 详细

51nod 1042 数字0-9的数量

时间:2018-04-20 23:35:32      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:mes   tail   fine   set   stream   style   cout   ==   define   

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的数量

标签:mes   tail   fine   set   stream   style   cout   ==   define   

原文地址:https://www.cnblogs.com/xingkongyihao/p/8893856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!