題目:
如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等于另一個數,則稱這兩個數為互滿數。求出3000以内所有的互滿數并輸出。
先附上代碼:
// Chapter1_8.cpp : Defines the entry point for the application.
// 如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等于另一個數,則稱這兩個數為互滿數。
// 求出3000以内所有的互滿數并輸出。
#include "stdafx.h"
#include<iostream>
using namespace std;
int main()
{
int i,j,sum=1,sum2=1; //賦初值為1是因為每個正整數都有1這個約數
for(i=3;i<3000;i++)
{
for(j=2;j<i;j++)
{
//求約數和
if(i%j==0)
{
sum += i/j;
}
}
//計算約數和的約數和
for(j=2;j<sum;j++)
{
if(sum%j==0)
{
sum2 += sum/j;
}
}
//如果一個數的所有約數和正好等于另一個數
if(i>sum && i==sum2) //剔除掉兩數相等以及一組資料僅次序不同而出現兩次的情況
cout << i << " , " << sum << endl;
//重新賦初值
sum = 1;
sum2 = 1;
}
system("pause");
return 0;
}
運作結果如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1ADO3MTOwYTM0EjMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
值得注意的是這行代碼:
if(i>sum && i==sum2) //剔除掉兩數相等以及一組資料僅次序不同而出現兩次的情況
其中的 i>sum 判斷語句很重要,如果沒有這個限制,那麼就會出現如下情況:
即會出現列印兩數相等以及一組資料僅次序不同而出現兩次的情況。