【雜題】完數判斷
阿新 • • 發佈:2020-11-19
題目描述
一個數如果恰好等於不包含它本身所有因子之和,這個數就稱為"完數"。 例如,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;
}
通過這道題目,可以練習自定義函式、列舉法及累加求和的使用。