题目不难,按题意模拟即可,注意几个点:
- 素数不是 Smith 数;
- 不要提前给素数打表,否则容易超时;
- 从 n+1 开始判断。
#include <iostream>
#include <cmath>
using namespace std;
//计算x的各位相加之和
int eachBitSum(int x)
{
int sum = 0;
while (x != 0)
{
sum += x % 10;
x /= 10;
}
return sum;
}
//判断n是否为Smith数
bool isSmith(int n)
{
bool isPrime = true; //n是否为素数
int sum1= eachBitSum(n); //n的各位相加之和
int sum2 = 0; //n的所有素因数按位相加之和
for (int i = 2; i <= (int)sqrt(n); i++)
{
while (n % i == 0)
{
isPrime = false;
sum2 += eachBitSum(i);
n /= i;
}
if (n == 1)
break;
}
if (n != 1)
sum2 += eachBitSum(n);
if (sum1 == sum2 && isPrime == false)
return true;
else
return false;
}
int main()
{
int n;
while (cin >> n)
{
if (n == 0)
break;
while (++n)
{
if (isSmith(n))
{
cout << n << endl;
break;
}
}
}
return 0;
}
继续加油。