1. 程式人生 > 實用技巧 >【雜題】完數判斷

【雜題】完數判斷

題目描述

一個數如果恰好等於不包含它本身所有因子之和,這個數就稱為"完數"。 例如,6的因子為1、2、3,而6=1+2+3,因此6是"完數"。 程式設計序找出N之內的所有完數,並按下面格式輸出其因子

輸入

N

輸出

? its factors are ? ? ?

樣例輸入

1000

樣例輸出

6 its factors are 1 2 3 
28 its factors are 1 2 4 7 14 
496 its factors are 1 2 4 8 16 31 62 124 248 

分析

題目完整地讀下來,我可發現,這道題地關鍵就在於如何判斷完數以及按格式輸出完數的所有因子。假設法,存在函式能幫助我們判斷數字是否是完數,以及存在函式能幫助我們將數字的所有因子按格式輸出,將他們分別起名為isCompNum()和printFactors()。我們可以寫出對應的整體框架

int main()
{
    int n;// 存放範圍
    cin>>n;// 輸入範圍
    for(int i=6;i<=n;i++)//最小的完數是6,遍歷6~n
    {
        if(isCompNum(i))// 如果是完數
        {
            printFactors(i);//按格式輸出所有因子
        }
    }
    return 0;
}

接著,完成isCompNum函式以及printFactors函式的具體實現。先從完數的判斷開始,從定義出發,一個數如果恰好等於不包含它本身所有因子之和,這個數就稱為"完數"。此時我們只需找出數字所有非自身因子,將他們累加,將和與自身進行比較,相同則是完數,不同則不是。

bool isCompNum(int num)
{// 判斷完數,是的話返回true ,不是返回false
    int sum=0;// 儲存計算不包含本身的所有因子之和
    for(int i=1;i<num;i++)
    {//遍歷 1~num-1
        if(num%i==0) sum+=i;// 如果能整除,則i是num的因子,進行累加求和
    }
    return sum==num;//返回總和與Num的判斷結果
}

再進行因子的輸出,遍歷所有的因子,去除掉自身之後輸出即可。注意輸出格式,最後加上換行。

void printFactors(int num)
{// 輸出數字num的所有因子
    cout<<num<<" its factors are";
    for(int i=1;i<num;i++)
    {// 遍歷1~num-1
        if(num%i==0)//如果i是num的因子
        {
            cout<<" "<<i;
        }
    }
    cout<<endl;
}

然後將他們整合起來,即完成了這道題目。

#include <iostream>
using namespace std;
bool isCompNum(int num)
{// 判斷完數,是的話返回true ,不是返回false
    int sum=0;// 儲存計算不包含本身的所有因子之和
    for(int i=1;i<num;i++)
    {//遍歷 1~num-1
        if(num%i==0) sum+=i;// 如果能整除,則i是num的因子,進行累加求和
    }
    return sum==num;//返回總和與Num的判斷結果
}

void printFactors(int num)
{// 輸出數字num的所有因子
    cout<<num<<" its factors are";
    for(int i=1;i<num;i++)
    {// 遍歷1~num-1
        if(num%i==0)//如果i是num的因子
        {
            cout<<" "<<i;
        }
    }
    cout<<endl;
}
int main()
{
    int n;// 存放範圍
    cin>>n;// 輸入範圍
    for(int i=6;i<=n;i++)//最小的完數是6,遍歷6~n
    {
        if(isCompNum(i))// 如果是完數
        {
            printFactors(i);//按格式輸出所有因子
        }
    }

    return 0;
}

通過這道題目,可以練習自定義函式、列舉法及累加求和的使用。