PC/UVa 110706/10042 Smith Numbers

来源:互联网 发布:京东java在线笔试题 编辑:程序博客网 时间:2024/05/29 02:19

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;

}