51nod 1042 数字0-9的数量

本文介绍了一种算法,用于计算指定区间内数字0-9出现的总次数。通过递归分解区间,利用数学方法快速得出每个数字出现的次数,并提供了一个C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 }

 

转载于:https://www.cnblogs.com/xingkongyihao/p/8893856.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值