找不到错误(Project Euler#8(Scala))

时间:2019-01-05 18:22:42

标签: scala

因此,我一直在Scala中进行欧拉计画问题,但似乎停留在第8位,该问题要求在1000位数字中找到具有最大乘积的13位相邻数字。我写的代码如下

import scala.io.Source

val digits1000File = "1000Digit.txt"
val lines = Source.fromFile(digits1000File).getLines.toList
val digits1000 = lines.mkString("")

//finds the greatest product of n adjacent digits in the string
def greatestAdjProduct(digits : String,n: Int): Int = {
  val xs = for(
    i <- 0 until digits.length - n
  ) yield digits.substring(i,i+n)
  xs.map(s =>s.map(_.asDigit).product).max
}

println(s"euler 8 = ${greatestAdjProduct(digits1000,13)}")

这对于4位数字来说是正确的,但是对于13位数字却似乎不起作用。有人可以帮我吗?

1 个答案:

答案 0 :(得分:3)

您的代码有多个问题。

首先,在您的for理解中,应使用to而不是until以避免一个单一的错误。您也可以用val xs = digits.sliding(n)代替所说的理解。

第二,您有一个溢出错误。 13位数字的乘积可能太大而无法容纳在Int中。由于整数溢出,以下返回-754810903:

"9999999999999".map(_.asDigit).product

要解决此问题,您可以使用BigInt

"9999999999999".map(d => BigInt(d.asDigit)).product

Long在这里也可以使用,但是BigInt是更通用的解决方案。