Получить неправильный результат - Java

1

Я пытаюсь построить программу, которая сообщит мне продукт из 13 соседних номеров с самым высоким продуктом. Тем не менее, он продолжает давать мне неправильный ответ. Что не так с этим кодом?

import java.lang.Character; 

public class ProjectEuler8 { public static void main(String[] args) { 

  String num = "73167176531330624919225119674426574742355349194934"+
"9698352031277450632623957831801698480186947885184385861560789112949495459501737958331952853208805511"+
"1254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113"+
"6222989342338030813533627661428280644448664523874930358907296290491560440772390713810515859307960866"+
"7017242712188399879790879227492190169972088809377665727333001053367881220235421809751254540594752243"+
"5258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482"+
"8397224137565705605749026140797296865241453510047482166370484403199890008895243450658541227588666881"+
"1642717147992444292823086346567481391912316282458617866458359124566529476545682848912883142607690042"+
"2421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188"+
"8458015616609791913387549920052406368991256071760605886116467109405077541002256983155200055935729725"+
"71636269561882670428252483600823257530420752963450";

  int NUM_LENGTH = num.length(); 

  char[] number = new char[NUM_LENGTH];

  for (int i=0; i<NUM_LENGTH; i++) { number[i] = num.charAt(i); }

  int mult=0; 
  int highest=0; 

  for (int j=0; j<=987; j++) {
  int a = number[j]; a=Character.getNumericValue(a); 
  int b = number[j+1]; b=Character.getNumericValue(b); 
  int c = number[j+2]; c=Character.getNumericValue(c); 
  int d = number[j+3]; d=Character.getNumericValue(d);   


  int e = number[j+4]; e=Character.getNumericValue(e); 
  int f = number[j+5]; f=Character.getNumericValue(f); 
  int g = number[j+6]; g=Character.getNumericValue(g); 
  int h = number[j+7]; h=Character.getNumericValue(h); 
  int i = number[j+8]; i=Character.getNumericValue(i); 
  int k = number[j+9]; k=Character.getNumericValue(k);
  int l = number[j+10]; l=Character.getNumericValue(l);
  int m = number[j+11]; m=Character.getNumericValue(m);
  int n = number[j+12]; n=Character.getNumericValue(n);

  mult = a*b*c*d*e*f*g*h*i*k*l*m*n;  
  if (mult > highest)
    highest = mult; 
  System.out.println(highest);} 

  }}
  • 0
    И каковы правильные и неправильные ответы?
  • 0
    Неправильный ответ 2091059712. Я не знаю правильный ответ.
Показать ещё 2 комментария
Теги:

3 ответа

2

Код выглядит хорошо для меня. Он предоставит вам список размером в круг размером 988. Хотя вы отправляете чек для печати значения самого высокого продукта в каждом цикле. Я не знаю, что вы подразумеваете под "неправильным" ответом, интересно, вы даже выделили ответ из всех целых чисел, выводимых этой функцией. Между прочим, он будет последним.

Предложения: Храните временное значение наивысшего значения в некотором фиктивном целом, а затем распечатайте его вне цикла.

Существует много возможностей для повторного кодирования кода, а именно, вы можете избавиться от логики, чтобы получить массив символов, и вы можете обойтись без вычислительной над головой умножения целых чисел, когда любая из 13 цифр равна 0.

  • 0
    Не уверен, как это может быть последним, поскольку строка заканчивается на 0.
  • 0
    В любой момент самый высокий будет иметь наибольшее значение продукта из всех соседних 13. Я запустил его локально, вывод начинается 5000940 5000940 5000940 -> предположим, 0 приходит сюда; но код делает, если (мульт> наивысший) 5000940 ... ... ... продолжается таким образом, что последний является наибольшим произведением из 13 смежных чисел.
0

Могу ли я предложить другой подход с использованием Java 8 (если у вас есть)? Это может упростить диагностику, избавив все переменные от смежных значений.

List<Integer> digitList(String numberText) {
    return numberText.chars().map(c -> Character.digit(c, 10))
        .collect(Collectors.toList);
}

long highestAdjacentProduct(List<Integer> inputs) {
    int adjacentLength = 13;
    return IntStream.range(0, input.size() - adjacentLength)
        .mapToLong(i -> inputs.subList(i, i + adjacentLength)
            .stream().reduce(1, (n1, n2) -> n1 * n2)))
        .max();
}

Это используется с highestAdjacentProduct(digitList(inputString))

Действительно хорошая идея об использовании потоков, таких как вы можете тривиально добавить peek методы для печати промежуточных значений, чтобы гарантировать, что расчеты работают, как вы ожидаете.

0

У вас есть целочисленное переполнение; только номера ввода слишком велики, чтобы соответствовать 31 бит. Вместо этого вам нужно использовать BigInteger.

  • 0
    Я сохранил их как строку.
  • 0
    @microslayer А затем поместите их в int mult .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню