我对Scala很陌生,所以对这个非常基本的问题表示道歉。
我有这个伟大的班轮,检查一个数字是否是一个素数。我正在尝试用它做的是允许函数接收一个数组并吐出素数。
我怎样才能做到最好?是否也可以在一个班轮中这样做?谢谢!
def isPrime(num: Int): Boolean = (2 to num) forall (x => num % x != 0)
答案 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
,它仍然会为0
和1
返回奇怪的结果。
这是一个非常简单的实现,可以返回0
和1
的正确结果,并且只检查小于(大约)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位数。