题目描述:
smith数是指满足下列条件的可分解的整数:
其所有位数上的数字和等于其全部素数因子的数字之和。
例如,9975是smith数,9975=3*5*5*7*19,即9975的数字和=因子的数字总和=30.
补充说明一下:根据smith数的定义,素数不是smith数。
输入多组数据,判断输入的数是否为smith数,如果是输出Yes,否则输出No
解题思路:设输入的数为n
(1)首先求出n的各个位之和,这个很简单,不再赘述
(2)求输入数的质数因子(既能整除n,又是质数),这里需要注意的一点就是质因子的重复问题,思路详见在代码。
(3)求出质因子的各位数之和。(注意!质因子也是求各位之和哦!)
(4)判断各位数之和和质因子各位数之和是否相等。
#include<iostream>
#include<algorithm>
using namespace std;
/*判断一个数是否为素数*/
bool isPrime(int n) {
if (n <= 3) {
return n > 1;
}
// 求平方根,注意sqrt()的参数为 double 类型,这里要强制转换m的类型
int k = (int)sqrt((double)n);
int i;
for (i = 2; i <= k; i++) {
if (n % i == 0) {
return false;
}
}
// 如果完成所有循环,那么m为素数
return true;
}
/*求个位数之和*/
int sumgewei(int num) {
int sumg = 0;//各位之和
while (num) {
sumg += num % 10;//计算每一位的和
num = num / 10;
}
return sumg;
}
int main() {
int n;
while (scanf_s("%d", &n)) {
if (isPrime(n)) {
//素数不是smith数
printf("No");
}
else {
int sumg = sumgewei(n);//各位之和n
int sump = 0;//质因子之和
for (int i = 2; i <= n;) {
if ((n%i == 0) && isPrime(i)) {
sump += sumgewei(i);
n = n / i;
}
else {
// 因为要对找出以一个质因子后得到的除数在找质因子,而且还是要从i = 2开始
// i++;放在这里既解决了上述问题,也对上述除数提供了循环
i++;
}
}
if (sumg == sump) {
printf("Yes");
}
else {
printf("No");
}
}
}
system("pause");
return 0;
}
唯有热爱方能抵御岁月漫长。