【问题标题】:Scala return prime numbers from ArrayScala从数组返回素数
【发布时间】:2025-12-09 22:05:01
【问题描述】:

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

我有一个很棒的班轮,可以检查一个数字是否是素数。我试图用它做的是允许函数接收一个数组并吐出素数。

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

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

【问题讨论】:

  • 查看filter函数。
  • math.ceil(math.sqrt(num)).toInt 应该够了...

标签: scala primes


【解决方案1】:

了解主要功能可能是您的任务/任务/兴趣的目标,但请注意,在 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 多位数字左右的数字。

【讨论】:

  • 这可能是正确的答案...有点解释有助于更好地理解:评论
【解决方案2】:

我正在尝试让函数接受一个数组并吐出素数

您可以执行以下操作

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 函数不起作用

【讨论】:

  • 注意:您的素数测试也不起作用。它返回0 -> true1 -> true。对于一个问题,我们可以得到多少 isPrime 的错误实现? ;)
  • @AndreyTyukin,感谢您指出这一点 :) 现在更新应该没问题了 :)
【解决方案3】:

您的isPrime 似乎完全坏了。

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

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

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))

【讨论】:

    【解决方案4】:

    你可以用这个方法

    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 
    

    【讨论】: