项目欧拉:#8

在尝试回答此问题时:

具有最大乘积的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 7163626956188267042825248360082 3257530420752963450

找到具有最大产品的1000位数字中的十三个相邻数字。 这个产品有什么价值?

我得到2091059712然而欧拉说答案是不正确的,有什么我可能做错了吗?

public class LargestProductThirteen{ public static void main( String[] args ) { final String num = ""; long greatestProduct = 0; for (int i = 0; i  greatestProduct) greatestProduct = sum; } System.out.println(greatestProduct); } } 

将所有这些字符的数值相乘时,您正在执行整数运算。 有了高位数,其中有13个,很可能这样的产品会溢出一个int ,其最大值约为20亿(10位)。

Character.getNumericValue方法返回一个int 。 将第一个返回值强制转换为强制long数学。

 long sum = (long) Character.getNumericValue(num.charAt(i))* Character.getNumericValue(num.charAt(i+1))* ... 

顺便说一句,即使您已经拥有了greatestProduct ,但由于某种原因,您将此变量定义为sum 。 出于语义的考虑,我会将其命名为product

您当前正在进行整数乘法(例如int(s)的乘法)。 鉴于您现有的代码 – 我看到的最简单的解决方案是更改总和计算,

 // This is a product, not a sum. long sum = Long.valueOf(num.charAt(i)) * Long.valueOf(num.charAt(i + 1)) * Long.valueOf(num.charAt(i + 2)) * Long.valueOf(num.charAt(i + 3)) * Long.valueOf(num.charAt(i + 4)) * Long.valueOf(num.charAt(i + 5)) * Long.valueOf(num.charAt(i + 6)) * Long.valueOf(num.charAt(i + 7)) * Long.valueOf(num.charAt(i + 8)) * Long.valueOf(num.charAt(i + 9)) * Long.valueOf(num.charAt(i + 10)) * Long.valueOf(num.charAt(i + 11)) * Long.valueOf(num.charAt(i + 12)); 

这是一个很好的谜题。

您的代码失败,因为您使用的是Character.getNumericValue。 你可以改用BigDecimal。

提示
*不要认为整数是一个长字符串。
*您正在寻找最大数量,而不是结果。
*相邻的四面八方。
*不要尝试使用longs(或任何其他数量的容器)。 无论结果如何,9 * 9 * 7都大于7 * 7 * 7。 您不必将它们相乘即可知道,因此构建一个在输入之间找到最大值的结构。

在Alexandre Santos评论的基础上,将每个13位数字视为13个字符串,您可以对字符串中的字符进行排序,因此98031变为01389,操作数的顺序与乘法无关(9 * 8 * 3 = 3 * 8 * 9)。 现在的问题是找到最大的字符串(用<比较字符串)。 在找到最大的字符串后,您只需要进行一次乘法(按排序顺序而不是大小。

另一个实现( for代替13个类似的东西):

 public static void main(String[] args) throws Exception { String x = ""; int numberOfDigits = 13; int dif = x.length() - numberOfDigits; long max = 0; for ( int i = 0 ; i <= dif ; i++ ) { long p = 1; int sup = i + numberOfDigits; for ( int j = i ; j < sup ; j++ ) { p*=Character.getNumericValue(x.charAt(j)); } if ( p > max ) { max = p; } } System.out.println(max); } 

可以使用以下观察结果进行改进

0 *? = 0

  • 简单的例子:

     if ( x.charAt(i) == '0' ) { continue; }