Smith数的判断
题⽬描述:
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"); return0;
}