Kotlin {1000}中的第10001个素数错误

时间:2018-04-18 19:08:31

标签: kotlin primes

我的代码:

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,这是错误的。这里的错误在哪里?我的主要检查功能不正确吗?感谢。

2 个答案:

答案 0 :(得分:0)

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

确保使用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())
}

答案 1 :(得分:-1)

素数的形式为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))