Я пытаюсь построить программу, которая сообщит мне продукт из 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);}
}}
Код выглядит хорошо для меня. Он предоставит вам список размером в круг размером 988. Хотя вы отправляете чек для печати значения самого высокого продукта в каждом цикле. Я не знаю, что вы подразумеваете под "неправильным" ответом, интересно, вы даже выделили ответ из всех целых чисел, выводимых этой функцией. Между прочим, он будет последним.
Предложения: Храните временное значение наивысшего значения в некотором фиктивном целом, а затем распечатайте его вне цикла.
Существует много возможностей для повторного кодирования кода, а именно, вы можете избавиться от логики, чтобы получить массив символов, и вы можете обойтись без вычислительной над головой умножения целых чисел, когда любая из 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
методы для печати промежуточных значений, чтобы гарантировать, что расчеты работают, как вы ожидаете.
У вас есть целочисленное переполнение; только номера ввода слишком велики, чтобы соответствовать 31 бит. Вместо этого вам нужно использовать BigInteger
.
int mult
.