题目分析:X为任意正数,正数Y,满足(X*10^y+Y)%Y=0,数Y被称为magic number。找出M~N之间的所有magic number。1~10^4之间的magic number的数字有:1, 2, 5,10, 20, 25, 50,100, 125, 200, 250, 500, 1000, 1250, 2000, 2500, 5000
规律就出来了,,,其他的都是125,200,250,500乘以10^i.........
代码:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; long long arr[10000]; const int MAX=1<<31-1;//2<<31-1...脑残了 int main() { int m,n; while(scanf("%d %d",&m,&n)!=EOF) { int a1=100,a2=125,a3=200,a4=250,a5=500,num=7; arr[0]=1,arr[1]=2,arr[2]=5; arr[3]=10,arr[4]=20,arr[5]=25,arr[6]=50; //printf("MAX=%d\n\n",MAX); long long temp; for(int i=0;i<=7;i++) { temp=(long long)pow(10.0,i*1.0); arr[num++]=a1*temp; arr[num++]=a2*temp; arr[num++]=a3*temp; arr[num++]=a4*temp; arr[num++]=a5*temp; if(arr[num-1]>MAX) break; } /*for(int i=0;i<num;i++) printf("%d ",arr[i]);*/ int start=-10,end=-10,ans=0; for(int i=0;i<num;i++) { if(start==-10) { if(arr[i]==m) { start=i-1; //printf("start=%d\n\n",start); } else if(arr[i]>m) start=i-1; } if(end==-10) { if(arr[i]==n) { end=i+1; // printf("end=%d\n\n",end); } else if(arr[i]>n) end=i; } } ans=end-start-1; printf("%d\n",ans); } //system("pause"); return 0; }