1. 程式人生 > >5.20親密數

5.20親密數

整數 算法 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親密數