题目描述:
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; }