所謂完數就是該數恰好等於除自身外的因子之和。例如:6=1+2+3,其中1、2、3為6的因子。本題要求編寫程式,找出任意兩正整數m和n之間的所有完數。
輸入格式:
輸入在一行中給出2個正整數m和n(1<m≤n≤10000),中間以空格分隔。
輸出格式:
逐行輸出給定範圍內每個完數的因子累加形式的分解式,每個完數佔一行,格式為“完數 = 因子1 + 因子2 + … + 因子k”,其中完數和因子均按遞增順序給出。若區間內沒有完數,則輸出“None”。
輸入樣例:
2 30
輸出樣例:
6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14
1 #include <stdio.h> 2 3 int isPerfect(int num); 4 void output(int num); 5 6 int main(int argc, char const *argv[]) 7 { 8 int m, n; 9 int i; 10 int count = 0; 11 12 scanf("%d %d", &m, &n); 13 14 for ( i = m; i <= n; i++ ) { 15 int num = i; 16 if ( isPerfect( num ) ) { 17 count++; 18 output(num); 19 } 20 } 21 if ( count == 0 ) { 22 printf("None "); 23 } 24 return 0; 25 } 26 27 int isPerfect(int num) 28 { 29 int nSum = 0; 30 int ret = 0; 31 for ( int i = 1; i < num; i++ ) { 32 if ( num % i == 0 ) { 33 nSum += i; 34 } 35 // 判斷一個數是不是完數 要把它所有的因子都加起來 36 if ( nSum == num && i + 1 == num) { 37 ret = 1; 38 } 39 } 40 return ret; 41 } 42 43 void output(int num) 44 { 45 int nSum = 0; 46 printf("%d = ", num); 47 for ( int i = 1; i < num; i++ ) { 48 if ( num % i == 0 ) { 49 nSum += i; 50 printf("%d", i); 51 if ( nSum == num ) { 52 break; 53 } else { 54 printf(" + "); 55 } 56 } 57 } 58 printf(" "); 59 }