1. 程式人生 > >程式基本演算法習題解析 如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等於另一個數,則稱這兩個數為互滿數。求出3000以內所有的互滿數並輸出。

程式基本演算法習題解析 如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等於另一個數,則稱這兩個數為互滿數。求出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;
}

執行結果如下:

值得注意的是這行程式碼:

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

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

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