本題要求實現一個計算整數因子和的簡單函數,並利用其實現另一個函數,輸出兩正整數m和n(0<m≤n≤10000)之間的所有完數。所謂完數就是該數恰好等於除自身外的因子之和。例如:6=1+2+3,其中1、2、3為6的因子。
函數接口定義:
int factorsum( int number ); void PrintPN( int m, int n );
其中函數factorsum
須返回int number
的因子和;函數PrintPN
要逐行輸出給定范圍[m
, n
]內每個完數的因子累加形式的分解式,每個完數占一行,格式為“完數 = 因子1 + 因子2 + ... + 因子k”,其中完數和因子均按遞增順序給出。如果給定區間內沒有完數,則輸出一行“No perfect number”。
裁判測試程序樣例:
#include <stdio.h> int factorsum( int number ); void PrintPN( int m, int n ); int main() { int i, m, n; scanf("%d %d", &m, &n); if ( factorsum(m) == m ) printf("%d is a perfect number\n", m); if ( factorsum(n) == n ) printf("%d is a perfect number\n", n); PrintPN(m, n); return 0; } /* 你的代碼將被嵌在這里 */
輸入樣例1:
1 30
輸出樣例1:
1 is a perfect number
1 = 1
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
輸入樣例2:
7 25
輸出樣例2:
No perfect number
1 /*思路: 2 結果包括: 3 1.一個也沒有輸出No; 4 2.只輸出1; 5 3.輸出一系列完數 6 其中產生第一種結果的情況包括: 7 (1)m==n&&m不是完數; 8 (2)m!=n&&區間中沒有完數。 9 產生第二種結果的情況包括: 10 (1)m==n&&m==1; 11 (2)m!=n&&m==1&&(m,n]的區間中沒有完數; 12 產生第三種結果的情況為: 13 m!=n&&[m,n]的區間中有完數,m可以是1. 14 15 由以上三種情況分析可以得到: 16 (1)m==n&&m==1直接輸出sum值為1,並輸出“1 = 1”; 17 (2)(m==n&&m==1)||(m==n&&m!=1)||(m!=n&&m==1)||(m!=n&&m!=1) 18 都依次遍歷,有完數則直接輸出(包括1),無完數則輸出No; 19 20 因此對兩個函數進行分工: 21 factorsum()函數用於計算sum值; 22 PrintFN()函數用於遍歷輸出:sum==0,說明無,輸出No;sum!=0,依次輸出。 23 24 其中在這里數字本身不能是它自己的因子, 25 所以對於一個數字m,對它進行遍歷時,它的遍歷范圍為[1,m), 26 那么m=1時此遍歷無法進行,因此將m=1單獨計算直接輸出sum值。 27 */ 28 29 int factorsum(int number){ 30 //因子和sum 31 int sum=0; 32 //從1到number依次遍歷,余數為0則是因子,加入sum中計算總和 33 if(number==1){ 34 return 1; 35 } 36 else{ 37 for(int i=1;i<number;i++){ 38 if(number%i==0){ 39 sum+=i; 40 } 41 } 42 } 43 //最后輸出sum 44 return sum; 45 } 46 47 void PrintPN(int m,int n){ 48 int num=0; 49 for(int j=m;j<=n;j++){ 50 //依次遍歷符合factorsum()函數條件的數字,並計算數目 51 if(factorsum(j)==j){ 52 //如果該值符合則首先輸入該值,以及第一個因子1 53 printf("%d = 1",j); 54 //依次遍歷符合整除條件的數字,輸出因子 55 for(int k=2;k<j;k++){ 56 if(j%k==0){ 57 printf(" + %d",k); 58 } 59 } 60 //該值因子遍歷完成,換行,計數加一 61 printf("\n"); 62 num++; 63 } 64 } 65 if(num==0){ 66 printf("No perfect number\n"); 67 } 68 } 69 70 /* 71 72 https://blog.csdn.net/dreampinguo/article/details/81092212 73 74 int factorsum(int number) 75 { 76 int sum = 0; 77 int i; 78 if (number == 1) 79 { 80 return 1; 81 } 82 else 83 { 84 for (i = 1; i < number; i++) 85 { 86 if (number % i == 0) 87 { 88 sum += i; 89 } 90 } 91 } 92 return sum; 93 } 94 95 void PrintPN(int m, int n) 96 { 97 int i, j; 98 int count = 0; 99 for (i = m; i <= n; i++) 100 { 101 if ((factorsum(i) == i)) 102 { 103 printf("%d = 1", i); 104 for (j = 2; j <= i / 2; j++) 105 { 106 if (i % j == 0) 107 { 108 printf(" + %d", j); 109 } 110 } 111 printf("\n"); 112 count++; 113 } 114 } 115 if (count == 0) 116 { 117 printf("No perfect number\n"); 118 } 119 } 120 */