問題描述
如果整數A的全部因子(包括1,不包括A本身)之和等於B;且整數B的全部因子(包括1,不包括B本身)之和等於A,則將整數A和B稱為親密數。求3000以內的全部親密數。
問題分析
根據問題描述,該問題可以轉化為:給定整數A,判斷A是否有親密數。
為解決該問題,首先定義變量a,並為其賦初值為某個整數。則按照親密數定義,要判斷a中存放的整數是否有親密數,只要計算出該整數的全部因子的累加和,並將該累加和存放到另一個變量b中,此時b中存放的也是一個整數。再計算b中存放整數的全部因子的累加和,將該累加和存放到變量n中。
若n等於a則可判定變量a和b中所存放的整數是親密數。
算法設計
計算數A的各因子的算法:用A依次對i(i的范圍可以是1〜A-1、1〜(A/2-1)中之一) 進行模(“%”,在編程過程中一定注意求模符號兩邊參加運算的數據必須為整數)運算,若模運算結果等於0,則i為A的一個因子加;否則i就不是A的因子。將所求得的因子累到變量B。
接下來求變量B的因子:算法同上,將B的因子之和累加到變量n。根據親密數的定義判斷變量n是否等於變量A(if(n==a)),若相等,則A和B是一對親密數,反之則不是。
程序流程圖:

下面是完整的代碼:
#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以內的全部整數*/ { for( b=0, i=1; i<=a/2; i++) /*計算數a的各因子,各因子之和存放於b*/ if(!(a%i)) b+=i; for( n=0, i=1; i<=b/2; i++ ) /*計算b的各因子,各因子之和存於n*/ if(!(b%i)) n+=i; if(n==a && a<b) /*使每對親密數只輸出一次*/ printf("%4d--%4d ", a, b); /*若n=a,則a和b是一對親密數,輸出*/ } return 0; }
運行結果:
There are following friendly--numbers pair smaller than 3000:
220-- 284 1184--1210 2620--2924
知識點補充
對於這類多次將某些值存儲到一個變量中時,一定要注意變量賦初值的位置。

最后,不管你是轉行也好,初學也罷,進階也可,如果你想學編程~
【值得關注】我的 C/C++編程學習交流俱樂部 【點擊進入】
問題答疑,學習交流,技術探討,還有超多編程資源大全,零基礎的視頻也超棒~