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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM