我正在尝试构建一个程序,它会告诉我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 :(得分:2)
代码看起来很好。它将为您提供循环大小988的列表。虽然您要检查每个循环中最高产品的打印值。我不知道你的'错误'答案是什么意思,我想知道你是否甚至从这个函数输出的所有整数中挑出了答案。顺便说一下,这将是最后一个。
建议:将最高临时值存储在某个虚拟整数中,然后在循环外打印出来。
有很多范围可以重新考虑代码,即你可以摆脱逻辑来获取char数组,当13位数中的任何一个为0时,你可以不用计算的整数乘法。
答案 1 :(得分:0)
你有整数溢出;只是输入数字太大而不适合31位。您需要改为使用BigInteger
。
答案 2 :(得分: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
方法来打印中间值,以确保计算按预期工作。