唉………………写的相当的乱,状态十分不好。
可以求每个数前面有多少个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; }
时间: 2024-11-10 11:49:11