Scala从Array返回素数

时间:2018-03-13 13:39:08

标签: scala primes

我对Scala很陌生,所以对这个非常基本的问题表示道歉。

我有这个伟大的班轮,检查一个数字是否是一个素数。我正在尝试用它做的是允许函数接收一个数组并吐出素数。

我怎样才能做到最好?是否也可以在一个班轮中这样做?谢谢!

def isPrime(num: Int): Boolean = (2 to num) forall (x => num % x != 0)

4 个答案:

答案 0 :(得分:0)

您可以使用此方法

def isPrime(num : Int) : Boolean = {
       ((1 to num).filter(e => (num % e == 0)).size) == 2
}
isPrime: (num: Int)Boolean

scala> (1 to 100) filter(isPrime(_)) foreach(e=> print(e+" "))
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

答案 1 :(得分:0)

您的isPrime似乎已完全崩溃。

即使您将to替换为until,它仍然会为01返回奇怪的结果。

这是一个非常简单的实现,可以返回01的正确结果,并且只检查小于(大约)sqrt(n)而不是n的除数:< / p>

def isPrime(n: Int) = 
  n == 2 || 
  (n > 1 && (2 to (math.sqrt(n).toInt + 1)).forall(n % _ > 0))

现在你可以filter来自范围(或列表)的素数:

(0 to 10000).filter(isPrime).foreach(println)

您也可以这样写:

0 to 10000 filter isPrime foreach println

但是这个带有显式lambdas的版本可能会更好地概括,即使在这种特殊情况下没有必要:

(0 to 10000).filter(n => isPrime(n)).foreach(n => println(n))

答案 2 :(得分:0)

  
    

我尝试使用它是允许函数接收一个数组并吐出素数

  

您可以执行以下操作

def primeNumbs(numbers: Array[Int]) = numbers.filter(x => !((2 until x-1) exists (x % _ == 0)) && x > 1)

如果您将数字数组作为

传递
println(primeNumbs(Array(1,2,3,6,7,10,11)).toList)

你应该得到

List(2, 3, 7, 11)

我希望答案很有帮助  

注意:您的isPrime功能无法正常工作

答案 3 :(得分:0)

理解主要功能可能是您的任务/任务/兴趣的目标,但请注意,JVM中已经可以使用BigInteger.isProbablePrime()。有了这个,并且Scala可以透明地调用Java,请尝试以下filter

import java.math.BigInteger
val r = (1 to 100).filter { BigInteger.valueOf(_).isProbablePrime(25) }.mkString(", ")
// "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97"

这可以通过迭代数字范围(或你的数组,或任何TraversableOnce,相同的语法),并让只传递满足条件的闭包中的那些数字“_”,即是素数。而不是使用字符串连接的折叠,有一个方便的帮助器mkString,它将一个分隔符插入一个序列并为你生成一个字符串。

不要担心这里的“可能”素数。对于像这里这样的小数字,尽管有方法名称,但没有涉及概率。这可能会导致数字大概超过30位数。