Задача из Проекта Эйлера: вроде решил, ответ по примеру верный(если брать 4 последовательных числа), а вот если взять 13 чисел, то неверно

116
27 января 2020, 17:50

Условие:

Наибольшее произведение четырех последовательных цифр в нижеприведенном 1000-значном числе равно 9 × 9 × 8 × 9 = 5832.

73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 24219022671055626321111109370544217506941658960408 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450

Найдите наибольшее произведение тринадцати последовательных цифр в данном числе.

Повторюсь, если взять 4 числа, как в примере, то ответ сходится, но если взять 13 чисел, то выдает ответ: 2091059712, а верный: 23514624000; Прошу помощи( Вот мой код:

public class Main {
public static void main(String[] args) {
    String fckstr = "73167176531330624919225119674426574742355349194934\r\n" + 
            "96983520312774506326239578318016984801869478851843\r\n" + 
            "85861560789112949495459501737958331952853208805511\r\n" + 
            "12540698747158523863050715693290963295227443043557\r\n" + 
            "66896648950445244523161731856403098711121722383113\r\n" + 
            "62229893423380308135336276614282806444486645238749\r\n" + 
            "30358907296290491560440772390713810515859307960866\r\n" + 
            "70172427121883998797908792274921901699720888093776\r\n" + 
            "65727333001053367881220235421809751254540594752243\r\n" + 
            "52584907711670556013604839586446706324415722155397\r\n" + 
            "53697817977846174064955149290862569321978468622482\r\n" + 
            "83972241375657056057490261407972968652414535100474\r\n" + 
            "82166370484403199890008895243450658541227588666881\r\n" + 
            "16427171479924442928230863465674813919123162824586\r\n" + 
            "17866458359124566529476545682848912883142607690042\r\n" + 
            "24219022671055626321111109370544217506941658960408\r\n" + 
            "07198403850962455444362981230987879927244284909188\r\n" + 
            "84580156166097919133875499200524063689912560717606\r\n" + 
            "05886116467109405077541002256983155200055935729725\r\n" + 
            "71636269561882670428252483600823257530420752963450";
    char[] mas = fckstr.toCharArray(); // массив из строки
    int[] mas2 = new int[fckstr.length()];args // создание массива для чисел
    int c, d = 0;
    for(int j = 0; j < fckstr.length(); j++) {
    mas2[j] = Character.getNumericValue(mas[j]); // перевод чисел из char в int
    }
    for(int i = 0; i < fckstr.length() - 12; i++) { // для 13 последовательных чисел
        c = mas2[i] * mas2[i + 1] * mas2[i + 2] * mas2[i + 3] * mas2[i + 4] 
                * mas2[i + 5] * mas2[i + 6] * mas2[i + 7] * mas2[i + 8]
                * mas2[i + 9] * mas2[i + 10] * mas2[i + 11] * mas2[i + 12];
        d = calc(c,d); // нахождение самого большого значения
    }
    System.out.println(d);
}
public static int calc(int a, int b) { //определяет большее значение
    int max;
    if(b > a) max = b;
    else max = a;
    return max;
  }
}

Если хотите проверить первый пример, то вам надо в цикле для последовательных чисел изменить - 12 на -3; а количество перемножаемых ячеек массива сократить до c = mas2[i] * mas2[i + 1] * mas2[i + 2] * mas2[i + 3]

Answer 1
public class Main {
    public static void main(String[] args) {
        String fckstr = "73167176531330624919225119674426574742355349194934"
                + "96983520312774506326239578318016984801869478851843"
                + "85861560789112949495459501737958331952853208805511"
                + "12540698747158523863050715693290963295227443043557"
                + "66896648950445244523161731856403098711121722383113"
                + "62229893423380308135336276614282806444486645238749"
                + "30358907296290491560440772390713810515859307960866"
                + "70172427121883998797908792274921901699720888093776"
                + "65727333001053367881220235421809751254540594752243"
                + "52584907711670556013604839586446706324415722155397"
                + "53697817977846174064955149290862569321978468622482"
                + "83972241375657056057490261407972968652414535100474"
                + "82166370484403199890008895243450658541227588666881"
                + "16427171479924442928230863465674813919123162824586"
                + "17866458359124566529476545682848912883142607690042"
                + "24219022671055626321111109370544217506941658960408"
                + "07198403850962455444362981230987879927244284909188"
                + "84580156166097919133875499200524063689912560717606"
                + "05886116467109405077541002256983155200055935729725"
                + "71636269561882670428252483600823257530420752963450";
        System.out.println(calculate(fckstr, 13));
    }
    public static long calculate(String fckstr, int numb) {        
        long result = 0, tmp = 1;
        for (int k = 0; k < numb; k++) {
            for (int i = k; i < fckstr.length(); i++) {
                result=Math.max(tmp*=Character.getNumericValue(fckstr.charAt(i)), result);
                if ((i-k)%numb==0) tmp=1;
            }
        }
        return result;
    }
}

Ваша проблема в символе \r\n, когда вы распознаете символ, то получаете здесь отрицательное значение - это -1, отсюда некорректный результат

Answer 2

Я решил сделать по своему и вот верное решение:

Что я сделал:
1 - Убрал /r/n, т.к. это нам не нужно .
2 - В отдельном методе calculate я принимаю число в виде строки и сколько последовательных чисел будет перемножаться .
3 - For-loop начинается от 0 и кончается длиной числа минус сколько чисел в ряд мы перемножаем
4 - Создаем второй for-loop, в котором перемножаем N последовательных чисел:
tempResult *= Character.getNumericValue(line.charAt(j)); .
5 - сравниваем tempResult с result и в конце выводим result, что будет являться наибольшим произведением N чисел

public class stackover {
    public static void main(String[] args) {
        String fckstr = "73167176531330624919225119674426574742355349194934" +
                "96983520312774506326239578318016984801869478851843" +
                "85861560789112949495459501737958331952853208805511" +
                "12540698747158523863050715693290963295227443043557" +
                "66896648950445244523161731856403098711121722383113" +
                "62229893423380308135336276614282806444486645238749" +
                "30358907296290491560440772390713810515859307960866" +
                "70172427121883998797908792274921901699720888093776" +
                "65727333001053367881220235421809751254540594752243" +
                "52584907711670556013604839586446706324415722155397" +
                "53697817977846174064955149290862569321978468622482" +
                "83972241375657056057490261407972968652414535100474" +
                "82166370484403199890008895243450658541227588666881" +
                "16427171479924442928230863465674813919123162824586" +
                "17866458359124566529476545682848912883142607690042" +
                "24219022671055626321111109370544217506941658960408" +
                "07198403850962455444362981230987879927244284909188" +
                "84580156166097919133875499200524063689912560717606" +
                "05886116467109405077541002256983155200055935729725" +
                "71636269561882670428252483600823257530420752963450";
        calculate(fckstr, 4);
        calculate(fckstr, 13);
    }
    private static void calculate(String line, int number){
        long result = 0;
        long tempResult;
        for (int i = 0; i <= line.length() - number; i++) {
            tempResult = 1;
            for(int j = i; j < i + number; j++){
                tempResult *= Character.getNumericValue(line.charAt(j));
            }
            if(tempResult >= result){
                result = tempResult;
            }
        }
        System.out.println("Result = " + result);
    }
}
Answer 3

Ваша ошибка в первоначальном варианте была была связана с неправильным типом данных для вычисления "c". int.MaxValue=2147483647 < 23514624000, которое Вы хотели получить. Если бы Вы использовали не int, а ulong или long, как в последнем варианте, то и первоначальный вариант "сработал" бы (наверное :) ).

READ ALSO
Не удается в фрагменте получить методы из интерфейса. Как это можно исправить?

Не удается в фрагменте получить методы из интерфейса. Как это можно исправить?

Почему при попытки получить методы из интерфейса, пишет Cannot resolve method 'isProduct()' и Cannot resolve method 'getMenuTitle()'ourMenuItemsя прописываю как ArrayList

110
настройка JNDI @Resource

настройка JNDI @Resource

в проекте (spring boot + embedded tomcat) я использую jar файл в котором есть класс

139
Не понятная работа уведомления

Не понятная работа уведомления

Создаю уведомление для приложения, вроде нормально работало, и резко не понимаю из-за чего(вроде ничего такого не делал) перестало вообще...

133
JWindow.toBack(); только для одного окна

JWindow.toBack(); только для одного окна

Столкнулся с проблемкой хочу убрать 1 окно на задний план, но почему-то убираются все с JFrame такой проблемы нет

133