習題6-3 使用函數輸出指定范圍內的完數 (20分)


本題要求實現一個計算整數因子和的簡單函數,並利用其實現另一個函數,輸出兩正整數m和n(0<mn10000)之間的所有完數。所謂完數就是該數恰好等於除自身外的因子之和。例如: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 */

 


免責聲明!

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



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