我一直在尝试解决Scala中的项目Euler number in 3,这是我到目前为止所做的:
def largestPrimeFactor(in:BigInt) : Option[BigInt] = {
def isPrime(in:BigInt) : Boolean = {
def innerIsPrime(in:BigInt, currentFactor:BigInt) : Boolean = {
if(in % currentFactor == 0) {
false
}
else {
if(currentFactor > (in / 2)){
true
}
else {
innerIsPrime(in, currentFactor + 1)
}
}
}
innerIsPrime(in, 2)
}
def nextLargeFactor(in:BigInt, divisor:BigInt) : (Option[BigInt], BigInt) = {
if((in / 2) > divisor) {
if(in % divisor == 0) (Some(in / divisor), divisor)
else nextLargeFactor(in, divisor + 1)
}
else
(None, divisor)
}
def innerLargePrime(in : BigInt, divisor:BigInt) : (Option[BigInt], BigInt) = {
nextLargeFactor(in, divisor) match {
case (Some(factor), div) => {
if(isPrime(factor)) (Some(factor), div)
else innerLargePrime(in, div + 1)
}
case (None, _) => (None, divisor)
}
}
innerLargePrime(in, 2)._1
}
我认为这会奏效,但我会坚持工作(在慢速构建期间利用时间)并且只有SimplyScala服务 - 这是超时(我会在家里检查)。
但是因为这是我写过的任何篇幅的Scala的第一部分,我想我会问,我犯了什么可怕的罪?我的解决方案多么无可救药?我践踏了哪些约定?
谢谢!
答案 0 :(得分:9)
我真的没有得到你想要完成的事情。就这么简单:
def largestPrimeFactor(b : BigInt) = {
def loop(f:BigInt, n: BigInt): BigInt =
if (f == n) n else
if (n % f == 0) loop(f, n / f)
else loop(f + 1, n)
loop (BigInt(2), b)
}
虽然这里没有优化,但我立刻得到了结果。唯一的“技巧”是你必须知道一个数字中最小的因子(大一个)是“自动”素数,并且你可以在找到一个因子后将数字除以。
答案 1 :(得分:1)
取自here:
lazy val ps: Stream[Int] =
2 #:: ps.map(i =>
Stream.from(i + 1).find(j =>
ps.takeWhile(k => k * k <= j).forall(j % _ > 0)
).get
)
val n = 600851475143L
val limit = math.sqrt(n)
val r = ps.view.takeWhile(_ < limit).filter(n % _ == 0).max
r是你的答案