我的做法可能很弱智
給定一個數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>
6
using namespace std;
7
long long aarray[10]=
{0};
8
long long barray[10]=
{0};
9
long long diff[10]=
{0};
10
char tempstr[10] = "";
11
12
13
int 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
38
int 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
}