亲密数:用穷举法直接对3000个数字进行遍历非常耗时
以下为改进代码:
#include<stdio.h>
int factorSum(a){//求a因子和
int i,sum=0;
for(i=1; i<a; i++)
if(a%i==0) //i和a的一个因子
sum+=i; //求因子和
return sum;
}
//判断a与b是否为亲密数,x[j]==i&&x[i]==j是亲密数返回1,否返回0
int isFriend(int a,int b,int i,int j){
if(a==j&&b==i) return 1;
else return 0;
}
void friendly(){
int i,j,x[3001];
for(i=1;i<=3000;i++)
x[i]=factorSum(i); //先把各元素因子和存入x[]
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;//表示已经找到
}
}
}
}
int main(){
friendly();
return 0;
}