九度oj 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

题目描述:

亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他。问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

 

输入:

输入有多组数据,每组测试数据为一行。

每一行有两个整数a,b(0<=a,b<=1,000,000,000)。

 

输出:

对应每个测试案例,输出a和b之间1出现的次数。

 

样例输入:
0 5
1 13
21 55
31 99
样例输出:
1
6
4
7

这个题目是按1491的思路来做的
代码如下
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 char a[12], b[12];
 5 
 6 int main(void){
 7     
 8     while (scanf ("%s %s", a,b) != EOF) {
 9         int ra = 0;
10         int numa = 0;
11         int cnta1 = 0;
12         int lena = strlen(a);
13         for(int i = 0; i < lena; i++) {
14             int q = 0;
15             int tmp = a[i] - '0';
16             if(tmp >= 1) {
17                 q = 1;
18             }
19             ra = numa + q +   (ra - cnta1) * 10 + (tmp+1) * cnta1;
20             //个位            //前位
21             //for example 123
22             // 12 + 1 + (F(12) - 1的个数 )*10 + 个位的个数 * 前面出现1的个数
23             //               F(11)
24             // 1--12 1 +  0 1
25             numa = numa * 10 + tmp;
26             if(tmp == 1) {
27                 cnta1++;
28             }
29         }
30         int rb = 0;
31         int numb = 0;
32         int cntb1 = 0;
33         int lenb = strlen(b);
34         for(int i = 0; i < lenb; i++) {
35             int q = 0;
36             int tmp = b[i] - '0';
37             if(tmp >= 1) {
38                 q = 1;
39             }
40             rb = numb + q + (rb - cntb1)*10 + (tmp+1)*cntb1;
41             numb = numb * 10 + tmp;
42             if(tmp == 1) {
43                 cntb1++;
44             }
45         }
46         int ans = 0;
47         if(numb > numa) {
48             ans = rb - (ra-cnta1);
49         }
50         else{
51             ans = ra - (rb-cntb1);
52         }
53         printf("%d\n",ans);
54     }
55         return 0;
56 }

一开始提交错误,因为题目中居然没有说a,b的大小关系。

注意47行是numb和numa比较,而不是rb和 ra比较

转载于:https://www.cnblogs.com/jasonJie/p/5810789.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值