1 最小的素数是2 也就是说0 和1 不是smith数
2 先求素因子,再求各个素因子的各位数字之和,然后相加
3 素数不是smith数
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define maxnum 1000
int n;
int num[maxnum],num1[maxnum],l;//记录 素数因子 和素因子的个数
int getNum(int n)//得到一个数n的各位数字之和
{
int sum=0;
int r;
r=0;
do
{
r=n%10;
sum+=r;
n/=10;
} while (n>0);
return sum;
}
int getPrem(int m)//得到一个数m的素数因子,并判断他是不是素数,如果是素数返回-1 如果不是返回这个数的各个素因子的数字之和
{
memset(num,0,sizeof(num));
memset(num1,0,sizeof(num1));
int i,sum;
int t=m;
i=2;
l=0;
if(m%i==0)
{
while(m%i==0)
{
m/=i;
num1[l]++;
}
num[l]=i;
l++;
}
for(i=3;i*i<=m;i+=2)
{
if(m%i==0)
{
while(m%i==0)
{
num1[l]++;
m/=i;
}
num[l]=i;
l++;
}
}
if(m>1)
{
num[l]=m;
num1[l]++;
l++;
}
if(m==t||t==num[0]) return -1;
sum=0;
for(i=0;i<l;i++)
{
if(num[i]>=10)
{
sum+=getNum(num[i])*num1[i];
}
else sum+=num[i]*num1[i];
}
return sum;
}
int main()
{
int t;
int i;
int flag;
int t1,t2;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
flag=-1;
for(i=n+1;;i++)
{
t1=getPrem(i);
if(t1!=-1)
{
t2=getNum(i);
if(t1==t2)
{
flag=i;
break;
}
}
}
printf("%d\n",flag);
}
return 0;
}