【问题标题】:Error 10001st prime number in KotlinKotlin 中的第 10001 个质数错误
【发布时间】:2018-04-18 19:08:30
【问题描述】:

我的代码:

import java.util.*

fun checkPrime(n : Int): Boolean{
    val z = n/2
    var stop = false
    if(n == 0 || n == 1){
        stop = true
        return false
    }
    for(i in 2..z){
        if(n % i == 0){
            stop = true
            return false
            break
        }
    }
    return !stop
}

fun main(args : Array<String>){
    var primes = ArrayList<Int>()
    //The "500000" can be replaced with any number so you get at least 100001 primes
    for(i in 2..500000){
        if(checkPrime(i)){
            primes.add(i)
        }
    }
    println("Finished")
    println("Size of Array: ${primes.size}")
    println("10001st Prime: ${primes.get(index = 10001)}")
}

我是 Kotlin 的新手,所以这对你来说可能看起来很可怕。当我运行它时,我得到 104759,这是错误的。这里的错误在哪里?我的素数检查功能不正确吗?谢谢。

【问题讨论】:

  • 您的程序是正确的,但您正在检查第 10002 个素数(因为索引从 0 开始),它确实是 104759
  • 另外,你的 z 应该是 n 的平方根,而不是 n/2;使用 stop 变量也没有意义,因为函数存在于 return 语句中

标签: kotlin primes


【解决方案1】:

或者,您可以使用 Java 内置的质数检查器和 Kotlin 由 buildSequence 生成的无限序列。

确保使用 take() 选择要提取的元素数量。

import java.math.BigInteger
import kotlin.coroutines.experimental.buildSequence

fun primes() = buildSequence {
    var n = 1
    while (true){
        if (BigInteger("$n").isProbablePrime(1)){
            yield(n)
        }
        n++
    }
}

fun main(args: Array<String>) {
    println(primes().take(10001).last())
}

【讨论】:

    【解决方案2】:

    质数的形式为 6f ± 1,不包括 2 和 3,其中 f 是任意整数

    fun isPrime(number: Int) : Boolean 
    {
    
       if (number <= 1)
       {
          return false;
       }   
    
       // The check for the number 2 and 3
       if (number <= 3)
       {
          return true;
       }
    
       if (number%2 == 0 || number%3 == 0)
       {
          return false;
       }
    
       for (i in 5..number/2 step 6)
       {
    
          if (number%i == 0 || number%(i+2) == 0)
          {
             return false;
          }   
       }
       return true;
    }
    

    解的时间复杂度:O(sqrt(n))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2016-09-15
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2018-05-11
      相关资源
      最近更新 更多