Проект Euler 23 в Java - близко к решению - PullRequest
0 голосов
/ 06 мая 2018

Я некоторое время работал над этой проблемой и был уверен, что мой метод сработает. Я получил свой текущий ответ 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);

логический массив. Значение true индекса равно сумме двух чисел, а если нет - 1007 *

    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 голосов
/ 07 мая 2018

Я не совсем уверен, что не так, но у меня такое чувство, что 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...