5.20親密數
阿新 • • 發佈:2017-05-04
整數 算法 actor iostream != 輸出 friendly light 數組
Q:若整數A的全部因子(包括1,不包括本身)之和等於B,並且整數B的全部因子之和等於A,則稱A與B是親密數。求解3000以內的全部親密數。
思路:先將1~3000以內所有數的全部因子之和算出來,存入到數組x[]中,這樣x[i]中存放的是i的因子之和,尋找{1,2,……3000}範圍中所有的親密數的算法 如下:
for(i=1;i<=3000;i++) //將1~3000所有數的因子和 放在一個數組x[1,2^3000]中 if(i沒找到其親密數,即i在集合B中) { for(j=i+1;j<=3000;j++) if(j為i的親密數) 輸出親密數(i,j),並記錄j已經找到其親密數; }
全部代碼如下:
#include <iostream> using namespace std; int factorsum(int a) {//求a的因子和 int sum=0; for(int i=1;i<a;i++) if(a%i==0) sum+=i; return sum; } int isfriend(int a,int b,int i,int j) {//判斷a與b是否是親密數,若是親密數就返回1,否則返回0 if(a==j && b==i) return 1; else return 0; } void friendly() { int i,j,x[3001]; for(i=1;i<=3000;i++) //將1~3000所有數的因子和 放在一個數組x[]中,省去了每次都要重復計算每個數的因子之和 x[i]=factorsum(i); for(i=1;i<=3000;i++) { if(x[i]!=-111) { for(j=i+1;j<=3000;j++) if(isfriend(x[i],x[j],i,j)) { printf("(%d,%d) ",i,j); x[j]=-111;//表示j已經找到親秘數 } } } } int main() { friendly(); return 0; }
5.20親密數