用JAVA语言编写“求相亲数”

问题描述:

220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284
284的真因数之和为1+2+4+71+142=220
毕达拉哥斯把这样的数对A,B称为相亲数;A的真因数之和为B,而B的真因数之和为A,求3000位以内的相亲数
用JAVA语言编写

[quote]Exception in thread "main" java.lang.ArithmeticException: / by zero [/quote]
这是0除数错误,呵呵,写得心急,没注意。

[code="java"]
public class Test2 {

/**
 * @param args
 */
public static void main(String[] args) {

      for(int i=1 ;i<3000;i++){
          IsMarrayNum(i); 
      }
}

public static void IsMarrayNum(int num){
      int sum=0;
    for(int i =1;i<num;i++){
       if(num%i==0)
          sum+=i;
    }
      int sum2=0;
    for(int j=1;j<sum;j++){
       if(sum%j==0)
         sum2+=j;
    }
      if(sum2==num){
        //是相亲数那就用一个对象存起来
          System.out.println("相亲数对:"+num+", "+sum);
      }

    } 

}
[/code]

public static void IsMarrayNum(int num){
int sum=0;
for(int i =0;i<num;i++){
if(num%i==0)
sum+=i;
}
int sum2=0;
for(int j=0;j<sum;j++){
if(sum%j==0)
sum2+=j;
}
if(sum2==num)
//是相亲数那就用一个对象存起来
}

public static void main(String args[]){
for(int i=0 ;i<3000;i++){
IsMarrayNum(i);
}
}

感觉效率不高,呵呵

(6,6)(28,28),(496,469),你可以多加个if语句就可以去掉,至于重复的,你可以用一个数组把他们放进去,就可以避免了