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");
    return 0;
}

 

posted @ 2020-03-23 22:40  做个读书人  阅读(1632)  评论(1编辑  收藏  举报