“Smith Numbers”:这些数字的各位数字之和和它本身被质因数分解后各位数字之和相同。如:4937775= 3*5*5*65837
4+9+3+7+7+7+5= 42
3+5+5+6+5+8+3+7=42
所以4937775就是一个 Smith Numbers
输入包括多组数据,每组数据一个数字 n 表示当前青铜门上显示的数字。输入以 0 结束。(n>0)
输出大于 n 的最小 Smith Numbers。
#include<stdio.h>
#include<string.h>
const int Max=100005;
int vis[Max],prime[10000],num;
void get_prime(){//提取Max以内的质数,存入prime数组
num=0;
memset(vis,0,sizeof(vis));
vis[0]=vis[1]=1;
for(int i=2;i<Max;i++){
if(!vis[i]){
prime[num++]=i;
for(int j=i+i;j<Max;j+=i)
vis[j]=1;//数字的倍数不是质数,要避免
}
}
}
bool is_prime(int x){//判断这个数字是否能进行质因数分解
if(x==0||x==1) return false;
if(x==2) return true;
if(x%2==0) return false;
for(int i=3;i*i<=x;i+=2){
if(x%i==0) return false;
}
return true;
}
int sum(int x){//计算输入数字各数字之和
int res=0;
while(x){
res+=x%10;
x/=10;
}
return res;
}
int main(){
get_prime();
int n;
while(scanf("%d",&n)!=EOF){
if(n==0) break;
for(int i=n+1;;i++){
if(is_prime(i))
continue;//判断n+1是否能进行分解,不能即进入下一循环
int s=0,tmp=i,tmpsum=sum(i);//s是分解后质数之和,tmpsum是原数之和
for(int j=0;j<num;j++){
if(tmp%prime[j]==0){
while(tmp%prime[j]==0){
s+=sum(prime[j]);
tmp/=prime[j];
}
if(is_prime(tmp)){//如果分解后剩下的数已经是质数了,那么结束循环,最后一个质数就是剩下的那个
s+=sum(tmp);
break;
}
}
}
if(tmpsum==s){
printf("%d\n",i);
break;
}
}
}
return 0;
}