检查Scala中的数字是否为素数

Arn*_*nab 3 scala

我想检查一个数字是否为素数.我编写了以下代码,但它没有返回任何值:

 def isprime(x:Int) = {
     | if (x==1) false
     | else {
     | for (i <- 2 to x-1) {
     | if (x % i == 0) false
     | else true
     | }
     | }
     | }
Run Code Online (Sandbox Code Playgroud)

eli*_*sah 7

你所做的是一个叫做定义一个函数,所以很明显它不会返回任何东西,事实上,这个函数返回AnyVal,这显然对你没什么帮助.我怀疑你确实需要返回一个布尔类型.

由于您正在使用REPL,因此您需要定义函数以检查数字是否为素数.我打电话给它isPrime2然后测试它.

def isPrime2(i :Int) : Boolean = {
|     if (i <= 1)
|       false
|     else if (i == 2)
|       true
|     else
|       !(2 to (i-1)).exists(x => i % x == 0)
|   }
// isPrime2: (i: Int)Boolean

(1 to 10).foreach(i => if (isPrime2(i)) println("%d is prime.".format(i)))
// 2 is prime.
// 3 is prime.
// 5 is prime.
// 7 is prime.
Run Code Online (Sandbox Code Playgroud)

如果您不关心if else条件,我甚至会建议一个更简单的版本:

def isPrime1(n: Int): Boolean = ! ((2 until n-1) exists (n % _ == 0))
Run Code Online (Sandbox Code Playgroud)

这也返回一个布尔值.

编辑:

正如@TheArchetypalPaul所述,这也暗示了,问题是你的for循环没有产生任何值 - 你计算一个真/假值,但后来不做任何事情.所以你的else子句不会产生任何值(事实上,它产生Unit).一旦找到除数,就需要返回false - 并且可能存在这样做的方式isPrime1.

  • 适用于大数的进一步细化:`def isPrime(n:Long):Boolean =!(2 +:(3到Math.sqrt(n).toInt由2存在)(n%_ == 0))` (5认同)

Mah*_*and 6

一个班轮解决方案

def isPrime(num:Int):Boolean =
(num > 1) && !(2 to scala.math.sqrt(num).toInt).exists(x =>num % x == 0)
Run Code Online (Sandbox Code Playgroud)