- 题目描述:
-
亲们!!我们的外国友人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 ",ans); 54 } 55 return 0; 56 }
一开始提交错误,因为题目中居然没有说a,b的大小关系。
注意47行是numb和numa比较,而不是rb和 ra比较