得到错误的结果 - Java

时间:2015-02-05 05:18:26

标签: java

我正在尝试构建一个程序,它会告诉我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);} 

  }}

3 个答案:

答案 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方法来打印中间值,以确保计算按预期工作。