我已经看到了关于此的其他线索,但他们都没有回答我的问题。事实上,我认为在我的情况下,问题与其他问题不同。
以下是我尝试解决的问题的链接:http://projecteuler.net/problem=55
我确信算法是正确的,但我怀疑Scala可以将其转换为字符串。我不知道。这是我的代码:
package projecteuler55
object PE55 extends App {
def rev ( x :BigInt) : BigInt = {
x.toString.reverse.toInt
}
def notPalindrome ( x:BigInt) : Boolean = {
if ( x != rev(x) ) true else false
}
def test (x:BigInt , steps:Int) : Boolean = {
if ( steps > 50 ) true
else if (notPalindrome(x) == false) false
else test ( x + rev(x) , steps +1)
}
var lychrel = 0
for (i<-10 until 10000){
if (test(i+rev(i),0)) lychrel += 1
}
println(lychrel)
}
我得到的错误是:
Exception in thread "main" java.lang.NumberFormatException: For input string: "2284457131"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:495)
at java.lang.Integer.parseInt(Integer.java:527)
at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:229)
at scala.collection.immutable.StringOps.toInt(StringOps.scala:31)
at projecteuler55.PE55$.rev(PE55.scala:8)
at projecteuler55.PE55$.notPalindrome(PE55.scala:14)
at projecteuler55.PE55$.test(PE55.scala:20)
at projecteuler55.PE55$$anonfun$1.apply$mcVI$sp(PE55.scala:26)
at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:141)
at projecteuler55.PE55$delayedInit$body.apply(PE55.scala:25)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:71)
at scala.App$$anonfun$main$1.apply(App.scala:71)
at scala.collection.immutable.List.foreach(List.scala:318)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32)
at scala.App$class.main(App.scala:71)
at projecteuler55.PE55$.main(PE55.scala:3)
at projecteuler55.PE55.main(PE55.scala)
为什么会这样?如果发生溢出,我也会使用BigInt
,但这似乎没有帮助。
提前致谢
答案 0 :(得分:3)
toInt
期望一个可以解析的字符串适合常规Int
,而2284457131则不能。您想使用BigInt(x.toString.reverse)
。