2015-01-21 39 views
0

我試圖在xCode的Swift中找到第n個素數,但我似乎無法得到這個工作,它只是給出了一個素數列表。快速的第n個素數

func nthPrimeNumber (n: Int) -> Int 
{ 
    var prime: Int 
    var divisor: Int 
    var isPrime: Bool 
    for (prime = 2; prime <= 50; ++prime) 
    { 
     isPrime = true; 
     for (divisor = 2; divisor < prime; ++divisor) 
     { 
      if ((prime % divisor) == 0) 
      { 
       isPrime = false 
      } 
     } 
     if (isPrime == true) 
     { 
      println(" \(prime)") 
     } 
    } 

    return prime 
} 
+2

您似乎沒有任何邏輯可以終止循環一次* n *找到了素數。 – 2015-01-21 01:51:51

+0

我不明白該怎麼做。例如,我想要第10個素數,它將返回值29. – WTL 2015-01-21 01:56:27

回答

0

使最小的改動你的代碼,但是,正如評論者說,終止邏輯:

func nthPrimeNumber(n: Int) -> Int { 
    var prime: Int 
    var divisor: Int 
    var isPrime: Bool 
    var counter = 0 
    for (prime = 2; prime <= 50 && counter < n; ++prime) 
    { 
     isPrime = true; 
     for (divisor = 2; divisor < prime; ++divisor) 
     { 
      if ((prime % divisor) == 0) 
      { 
       isPrime = false 
      } 
     } 
     if (isPrime) 
     { 
      counter++ 
     } 
    } 

    return prime-1 
} 
0

[注:此代碼返回nth素,如需要;不是50或51,都是非素數。]

您指定爲參數的n完全被忽略,因此當您的計算在prime變爲時終止。所有在50下的素數都被打印出來,並返回一個巧合的51。如果你想要第n個素數,你需要a)當你遇到他們時計算素數,b)當你得到第n個素數時停止。

你也有問題來處理'我想要20號總理,但我只想找50歲以下的素數' - 可能沒有素數。

而且,您正在執行prime % divisordivisor < prime但該除數永遠不需要超過prime/2

這一切都在一起,改善作風導致:

func nthPrimeNumber (var n: Int) -> Int 
{ 
    if n < 1 { return 0 } // error condition 

    var prime = 2 

    while (true) { // find the `nth` no matter how large `prime` 

    var isPrime = true 
    for (var divisor = 2; divisor <= prime/2; ++divisor) { 
     if 0 == prime % divisor { isPrime = false; break } 
    } 

    if isPrime { 
     println (" \(prime)") 
     if 0 == --n { return prime } 
    } 

    prime++ 
    } 
} 

和一些成果:

39> nthPrimeNumber(1) 
2 
$R7: (Int) = 2 
40> nthPrimeNumber(3) 
2 
3 
5 
$R8: (Int) = 5 
41> nthPrimeNumber(10) 
2 
3 
5 
7 
11 
13 
17 
19 
23 
29 
$R9: (Int) = 29 

我鼓勵你去嘗試的1000n

+1

1和4不是素數 – 2015-01-21 04:29:25

+0

果然;謝謝。固定。 – GoZoner 2015-01-21 04:35:46

1
extension Int { 
    var isPrime: Bool{ 
     if self < 2 { return false } 
     let squareRoot = Int(sqrt(Double(self))) 
     if squareRoot * squareRoot == self { return false } 
     for i in 2..<Int(ceil(sqrt(Double(self)))) where self % i == 0 { 
      return false 
     } 
     return true 
    } 
} 

var twoDigitsPrimeNumbers:[Int] = [] 
(1..<100).forEach({ $0.isPrime ? twoDigitsPrimeNumbers.append($0) :() }) 

print(twoDigitsPrimeNumbers.description) // [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] 

func nthPrime(nth: Int)-> Int { 
    var primeCounter = 0 
    var number = 2 
    while true { 
     if number.isPrime { 
      primeCounter += 1 
      if nth == primeCounter { return number } 
     } 
     number += 1 
    } 
} 
nthPrime(1000) // 7,919