java中的项目euler 23 - 接近解决方案

时间:2018-05-06 20:56:38

标签: java math

我已经在这个问题上工作了一段时间,我相信我的方法会起作用。我得到了我目前的答案4190404,有两种不同的方法可以找到总和。在21号(友好数字)中,我使用相同的算法来对数字的除数求和,这使我确信它能正常工作。我已经看过博客的指导,但我没有到达任何地方。如果有人能指出我正确的方向,我将非常感激。

import java.util.ArrayList;

public class problem23 {

public static void main(String[] args) {

    int upperLimit = 28123;
    long sum = 0;

列出将所有数量保持在我的上限之下

    ArrayList<Long> abunNums =  new ArrayList<Long>();
    abunNums.add((long) 0);

    for (long i = 1; i <= upperLimit; i++)
        if (isAbundant(i)) 
            abunNums.add(i);

布尔数组。索引的实际值是两个数字的总和,如果不是

则为假
    boolean[] isSumOfAbun = new boolean[upperLimit+1];

    int j = 0;
    for (int i = 1; i < abunNums.size(); i++) {
        j = i;
        while (abunNums.get(i) + abunNums.get(j) <= upperLimit) {
            isSumOfAbun[(int) (abunNums.get(i) + abunNums.get(j))] = true;
            j++;
        }
    }

//循环遍历布尔数组,并且如果数字//不能被描述为两个数字的总和,则循环索引和总和

    for (int i = 1; i <= upperLimit; i++) 
        if (!isSumOfAbun[i]) {
            sum += i;
            System.out.println(i);
        }

    System.out.println(sum);


}

测试数字是否丰富的方法

public static boolean isAbundant(long n) {

    long val = 1;
    for (int i = 2; i*i < n; i++)
        if (n % i == 0) {
            if (i == n/i)
                val += i;
            else
                val += i + (n/i);
        }

    if (val > n)
        return true;

    return false;
    }
}

1 个答案:

答案 0 :(得分:0)

我不确定出了什么问题,但我觉得isAbundant是错的。尝试使用此版本。

public static boolean isAbundant(long n) {
    long val = 1;
    for (int i = 2; i*i <= n; i++)
        if (n % i == 0)
            val += i;
        return val == n;
}