Amicable数字函数给出了错误的结果

时间:2015-11-03 15:20:52

标签: java

正如所描述的标题我想创建一个函数,告诉我两个数字我给出的是友好的,但由于某种原因我得到错误的答案,我希望有人会看到问题。

public class Amicable{

public static void main(String[] args){

    int n, m;
    int ndivisorsSum = 0;
    int mdivisorsSum = 0;

    n = Integer.parseInt(args[0]);
    m = Integer.parseInt(args[1]);

    for(int i = 1; i < n; i++){
        if (n % i == 0){
            ndivisorsSum = ndivisorsSum + i;
        }
    }

    for(int i = 1; i < m; i++){
        if (m % i == 0){
            mdivisorsSum = mdivisorsSum + i;
        }
    }

    if (ndivisorsSum == mdivisorsSum) {
        System.out.println(n + " and " + m + " are amicable numbers");
    }else{
        System.out.println(n + " and " + m + " are not amicable numbers");
    }

}
}

2 个答案:

答案 0 :(得分:5)

引用维基百科:

  

Amicable数字是两个不同的数字,因此相关的是每个的适当除数的总和等于另一个数。 (数字的适当除数是除数字本身之外的该数字的正因子。例如,6的适当除数是1,2和3.)一对友好数字构成句点2的等分序列。一个相关的概念是一个完整数字,它是一个等于其自身适当除数之和的数字,换句话说,是一个形成句点1的等分序列的数字。数字是等于序列序列的成员,周期大于2被称为社交号码。

那么最终导致你失败​​的是检查这两个数字是否友好的条件。你需要检查n的所有divisiors的总和是否等于m和vica verse。

int n, m;
int ndivisorsSum = 0;
int mdivisorsSum = 0;

n = 220;
m = 284;

for(int i = 1; i < n; i++){
    if (n % i == 0){
        ndivisorsSum += i;
    }
}

for(int i = 1; i < m; i++){
    if (m % i == 0){
        mdivisorsSum += i;
    }
}

if (ndivisorsSum == m && mdivisorsSum == n) { // Your mistake is here.
    System.out.println(n + " and " + m + " are amicable numbers");
}else{
    System.out.println(n + " and " + m + " are not amicable numbers");
}

答案 1 :(得分:1)

这不是友好数字的定义(根据维基百科)。

应该是

if (nDivisorsSum == m && mDivisorsSum == n)

输入时,您还应检查数字是否正确且为正数。您可以使用do-while循环重复,直到给出有效输入。