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