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


本題要求實現一個計算整數因子和的簡單函數,並利用其實現另一個函數,輸出兩正整數m和n(0)之間的所有完數。

所謂完數就是該數恰好等於除自身外的因子之和。例如:6=1+2+3,其中1、2、3為6的因子。

函數接口定義:

int factorsum( int number ); void PrintPN( int m, int n ); 
 

其中函數factorsum須返回int number的因子和;函數PrintPN要逐行輸出給定范圍[mn]內每個完數的因子累加形式的分解式,

每個完數占一行,格式為“完數 = 因子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


int factorsum( int number )
{
    int i=0,sum=0;
    
    if(number==1){
        return number;
    }
    
    //判斷number是否為完數
    for(i=1;i<number;i++){
            if(number%i == 0){
                sum += i;
            }
    } 
    
    //如果是完數,返回因子和
    if(sum == number){
        return sum;
    } 
    else 
        return 0;
}



void PrintPN( int m, int n )
{
    int i,j;
    int count = 0; //count作為是否有完數的標志
    
    //遍歷m-n找出所有的完數
    for(i=m;i<=n;i++){
        
        //如果i是完數,則打印出它的因子和形式
        if(factorsum(i)!=0){
            
            int sum = 0;//sum出循環自動銷毀
            count++;
            
            printf("%d = ",i);
            
            if(i==1){
                    printf("%d",i);
            } 
            
            for(j=1; j<i; j++){
                
                if(i%j == 0){
                    printf("%d",j);
                    sum += j;
                    
                //判斷是否結束的標志是左右式子是否相等
                    if(sum != i){
                            printf(" + ");
                    }    
                }
            }
            printf("\n");
        } 
    } 
    
    if(count==0){
            printf("No perfect number");
    }
}

 


免責聲明!

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



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