题目:Magic Number
题意:一个整数y,如果对于任意的整数x,将y放到x后面构成新的整数z,使得y能整除z,则y为magic number。问题是求给定区间上有多少个magic number。
假设y为k位数,则z=x* 10^k + y,如果对于任意的x,y都能整除z,那只能说明y整除10^k,那么y只能是10^k的因子,并且位数为k。
这样的数字并不多,我是先写出1,2,5,25,125这5个数字,然后将他们不断扩大10倍得到新的数字。
最后得到的小于2^31的magic number也才45个,对于询问直接暴力扫一遍看看哪些数字在区间上就行了。
#include<cstdio>
#include<algorithm>
using namespace std;
int list[]={1,2,5,25,125}, f[100];
int main(){
int p=0;
unsigned int u = 1;
u <<= 31;
for(int i=0; i<5; i++){
long long x = list[i];
while(x<u){
f[p++] = (int)x;
x*=10;
}
}
sort(f, f+p);
p = unique(f, f+p) - f;
int n, m;
while(~scanf("%d %d", &n, &m)){
int ans = 0;
for(int i=0; i<p; i++){
if(f[i]>=n && f[i]<=m) ans++;
}
printf("%d\n", ans);
}
return 0;
}