問題描述
如果整數(shù)A的全部因子(包括1,不包括A本身)之和等于B;且整數(shù)B的全部因子(包括1,不包括B本身)之和等于A,則將整數(shù)A和B稱為親密數(shù)。求3000以內(nèi)的全部親密數(shù)。
問題分析
根據(jù)問題描述,該問題可以轉(zhuǎn)化為:給定整數(shù)A,判斷A是否有親密數(shù)。
為解決該問題,首先定義變量a,并為其賦初值為某個(gè)整數(shù)。則按照親密數(shù)定義,要判斷a中存放的整數(shù)是否有親密數(shù),只要計(jì)算出該整數(shù)的全部因子的累加和,并將該累加和存放到另一個(gè)變量b中,此時(shí)b中存放的也是一個(gè)整數(shù)。再計(jì)算b中存放整數(shù)的全部因子的累加和,將該累加和存放到變量n中。
若n等于a則可判定變量a和b中所存放的整數(shù)是親密數(shù)。
算法設(shè)計(jì)
計(jì)算數(shù)A的各因子的算法:用A依次對(duì)i(i的范圍可以是1〜A-1、1〜(A/2-1)中之一) 進(jìn)行模(“%”,在編程過程中一定注意求模符號(hào)兩邊參加運(yùn)算的數(shù)據(jù)必須為整數(shù))運(yùn)算,若模運(yùn)算結(jié)果等于0,則i為A的一個(gè)因子加;否則i就不是A的因子。將所求得的因子累到變量B。
接下來(lái)求變量B的因子:算法同上,將B的因子之和累加到變量n。根據(jù)親密數(shù)的定義判斷變量n是否等于變量A(if(n==a)),若相等,則A和B是一對(duì)親密數(shù),反之則不是。
程序流程圖:
下面是完整的代碼:
#include<stdio.h>
int main()
{
int a, i, b, n;
printf("There are following friendly--numbers pair smaller than 3000:\n");
for( a=1; a<3000; a++ ) /*窮舉3000以內(nèi)的全部整數(shù)*/
{
for( b=0, i=1; i<=a/2; i++) /*計(jì)算數(shù)a的各因子,各因子之和存放于b*/
if(!(a%i))
b+=i;
for( n=0, i=1; i<=b/2; i++ ) /*計(jì)算b的各因子,各因子之和存于n*/
if(!(b%i))
n+=i;
if(n==a && a<b) /*使每對(duì)親密數(shù)只輸出一次*/
printf("%4d--%4d ", a, b); /*若n=a,則a和b是一對(duì)親密數(shù),輸出*/
}
return 0;
}
運(yùn)行結(jié)果:
There are following friendly--numbers pair smaller than 3000:
220-- 284 1184--1210 2620--2924
知識(shí)點(diǎn)補(bǔ)充
對(duì)于這類多次將某些值存儲(chǔ)到一個(gè)變量中時(shí),一定要注意變量賦初值的位置。