唉………………写的相当的乱,状态十分不好。
可以求每个数前面有多少个magic number,然后相减即可。
#include<iostream>
#include<cmath>
using namespace std;
int num(int x)
{
int sum=0;
while(x>0)
{
sum++;
x/=10;
}
return sum-3;
}
double pow(int b)
{
double s=1;
for(int i=1; i<=b; i++)
s*=10;
return s;
}
int solve(int x)
{
int s=0;
if(x==1)
return 1;
s=log10(x);
if(int(pow(s))==x)
{
if(x==10||x==100)
return s*4;
else
return s*5-2;
}
if(x<10)
{
if(x>=5)
s+=3;
else if(x>=2)
s+=2;
else if(x>=1)
s+=1;
}
else if(x<100)
{
s*=4;
if(x>=50)
s+=3;
else if(x>=25)
s+=2;
else if(x>=20)
s+=1;
}
else
{
int n=num(x);
s=5*s-2;
if(x>=500*pow(n))
{
s+=4;
}
else if(x>=250*pow(n))
s+=3;
else if(x>=200*pow(n))
s+=2;
else if(x>=125)
s+=1;
}
return s;
}
int main()
{
int m,n;
while(cin>>m>>n)
{
int km,kn;
if(m>n)
swap(m,n);
if(m==1)
{
km=1;
kn=solve(n);
cout<<kn-km+1<<endl;
continue;
}
else
km=solve(m-1);
kn=solve(n);
cout<<kn-km<<endl;
}
return 0;
}