1. 程式人生 > >7-45 找完數(20 分)

7-45 找完數(20 分)

分解 tex bre ... can ret style 正整數 bsp

所謂完數就是該數恰好等於除自身外的因子之和。例如:6=1+2+3,其中1、2、3為6的因子。本題要求編寫程序,找出任意兩正整數m和n之間的所有完數。

輸入格式:

輸入在一行中給出2個正整數m和n(1<mn10000),中間以空格分隔。

輸出格式:

逐行輸出給定範圍內每個完數的因子累加形式的分解式,每個完數占一行,格式為“完數 = 因子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\n"); 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("\n"); 59 }

7-45 找完數(20 分)