天天看點

程式基本算法習題解析 如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等于另一個數,則稱這兩個數為互滿數。求出3000以内所有的互滿數并輸出。

題目:

        如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等于另一個數,則稱這兩個數為互滿數。求出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;
}
           

運作結果如下:

程式基本算法習題解析 如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等于另一個數,則稱這兩個數為互滿數。求出3000以内所有的互滿數并輸出。

值得注意的是這行代碼:

if(i>sum && i==sum2) //剔除掉兩數相等以及一組資料僅次序不同而出現兩次的情況
           

 其中的 i>sum 判斷語句很重要,如果沒有這個限制,那麼就會出現如下情況:

程式基本算法習題解析 如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等于另一個數,則稱這兩個數為互滿數。求出3000以内所有的互滿數并輸出。

即會出現列印兩數相等以及一組資料僅次序不同而出現兩次的情況。