因此,我一直在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位数字却似乎不起作用。有人可以帮我吗?
答案 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
是更通用的解决方案。