题目大意:
Smith数是给定一个数,分解成若干质因数,将所有的质因数的每位加起来等于原来给定数的每位加起来的和,则这个数是Smith数(不包含素数),如4937775=3*5*5*65837,且4+9+3+7+7+7+5=42,3+5+5+6+5+8+3+7=42。本题则是输入一个整数,输出与该数相邻的Smith数。
题目分析:
关键是质因数的求解,其次是要区分开素数,因为素数不属于Smith数。
题目代码:
#include <iostream>
#include <cmath>
using namespace std;
intresult[1000]; //存放质因数
intdepth; //result数组的下标指示
bool isSmithNum(intn); //判断是是否为Smith数
void getPrime(intn); //求解质因数
bool isPrime(intn); //判断是否为质数
int main ()
{
int n;
while(cin>>n&& n!=0)
{
while(n++) //从大于n的数开始判断
{
if(isSmithNum(n))
{
cout<<n<<endl;
break;
}
}
}
return 0;
}
bool isSmithNum(int n)
{
inttemp=n; //保存n值
int i;
intsum=0; //将该数的每位进行求和保存到sum
do
{
sum+=temp;
temp=temp/10;
}while(temp);
depth=0;
getPrime(n); //求n的质因数
intacculate=0; //保存n的所有质因数每位求和后的结果
for(i=0;i
{
if(result[i]>10)
{
temp=result[i];
do
{
acculate+=temp;
temp=temp/10;
}while(temp);
}
else
acculate+=result[i];
}
if(acculate==sum &&depth>1) //注意depth>1条件,如果n为素数depth=1,否则depth>1
return true;
return false;
}
void getPrime(int n)
{
int i;
if(isPrime(n)) //n为素数直接存储起来return
{
result[depth]=n;
depth++;
return;
}
for(i=2;i
{
if(isPrime(i))
{
if(n%i==0)
{
result[depth]=i;
depth++;
getPrime(n/i);
return;
}
}
}
}
bool isPrime(int n)
{
int i;
for(i=2;i<=(int)sqrt(double(n));i++)
if(n%i==0)
return false;
return true;
}