我的做法可能很弱智
给定一个数x>0算通过每一位零出现次数的统计,算出所有的0的次数(从1到X)
举一个例子
2508这个数
首先考虑个位数
250X X=0;一共有250-1+1个
25X8 X=0;一共有258-10+1个
2X08 X=0;注意并不只有208-100+1中可能,我之前就错在这里了,因为最大2508,所以2099-2009这百位的零我就没有考虑到,所以这里的0有299-100+1个
于是题目就做出来了
输入一个a b
a<b
a==0时
b统计出零的个数然后加1(0)的个数
否则从a 到 b的0的个数则是从1到b的0个数减去从1到a-1的零的个数
a<10的情况我害怕出错就分开写了,所以整个程序有些长
下面就是我笨拙的代码
1#include <iostream>
2#include <string>
3#include <cstdio>
4#include <cstdlib>
5#include <cmath>
6using namespace std;
7long long aarray[10]={0};
8long long barray[10]={0};
9long long diff[10]={0};
10char tempstr[10] = "";
11
12
13int calc(std::string str,int i)
14{
15 //str.erase()
16 if(i==(str.size()-1)) return 0;
17 long long sum=0,len=str.size();
18 int needminus = int(pow(10.0,i));
19 //if(i!=0)str[len-i-2]+=(str[len-i-1]-'0');//new add
20 if(str[len-i-1]=='0')
21 {
22 str.erase(len-i-1,1);
23 }
24 else
25 {
26 str.erase(len-i-1,i+1);
27 str.append(i,'9');
28 }
29 for(int i=0;i<str.size();i++)
30 {
31 sum=sum*10+(str[i]-'0');
32 }
33 sum-=needminus;
34 sum+=1;
35 return sum;
36}
37
38int main()
39{
40 unsigned int a,b;
41 std::string tempstring;
42 int add;
43 while(scanf("%u %u",&a,&b))
44 {
45 add=0;
46
47 if(a==0)
48 add=1;
49 else {
50 add=0;
51 a--;
52 }
53 if(a==-2)
54 break;
55 int alen,blen;
56 if(a<10)
57 {
58 aarray[0]=0;
59 }
60 else
61 {
62 _i64toa(a,tempstr,10);
63 alen = strlen(tempstr);
64 tempstring.assign(tempstr);
65 for(int i=0;i<alen;i++)
66 {
67 aarray[i]=calc(tempstring,i);
68 }
69 }
70 _i64toa(b,tempstr,10);
71 blen = strlen(tempstr);
72 tempstring.assign(tempstr);
73 for(int i=0;i<blen;i++)
74 {
75 barray[i]=calc(tempstring,i);
76 }
77 for(int i=0;i<blen;i++)
78 {
79 diff[i]=barray[i]-aarray[i];
80 }
81 long long sum=0;
82 for(int i=0;i<blen;i++)
83 {
84 sum+=diff[i];
85 }
86
87 cout<<sum+add<<endl;
88 memset(aarray,0,sizeof(long long)*10);
89 memset(barray,0,sizeof(long long)*10);
90 memset(diff,0,sizeof(long long)*10);
91 }
92}