【问题标题】:nth prime number in swiftswift中的第n个素数
【发布时间】:2015-01-21 01:49:03
【问题描述】:

我试图在 xCode 的 Swift 中找到第 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
}

【问题讨论】:

  • 一旦找到 n 个素数,您似乎没有任何终止循环的逻辑。
  • 我不明白该怎么做。例如,我想要第 10 个素数,它会返回 29。

标签: xcode swift primes


【解决方案1】:
extension FixedWidthInteger {
    var isPrime: Bool {
        if self <  2 { return false }
        let squareRoot = Self(Double(self).squareRoot())
        if squareRoot * squareRoot == self { return false }
        for i in 2..<Self(Double(self).squareRoot().rounded(.up)) where self % i == 0 {
           return false
        }
        return true
    }
}

let twoDigitsPrimeNumbers = (1..<100).filter { $0.isPrime }
print(twoDigitsPrimeNumbers)  // [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

【讨论】:

    【解决方案2】:

    对您的代码进行最小的更改,但正如评论者所说,添加终止逻辑:

    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
    }
    

    【讨论】:

      【解决方案3】:

      [注意:此代码根据需要返回nth 素数;不只是 50 或 51,都是非素数。]

      您指定为参数的n 被完全忽略,因此当prime 变为51 时您的计算终止。打印了50 下的所有素数,并返回巧合的51。如果你想要第 n 个素数,你需要 a) 在遇到素数时数数,b) 在得到第 n 个素数时停止。

      您还需要处理“我想要第 20 个素数,但我只寻找 50 以下的素数”的问题 - 可能没有素数。

      而且,您正在执行 prime % divisordivisor &lt; 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
      

      我鼓励您尝试n of 1000

      【讨论】:

      • 1 和 4 不是素数
      【解决方案4】:
      func isNumberDivisible(_ number: Int, by divisor: Int) -> Bool {
          number % divisor == 0
      }
      
      func isPrime(_ number: Int) -> Bool {
          
          var result: Bool = true
          
          for divisor in stride(from: 2, to: number, by: 1) {
              if isNumberDivisible(number, by: divisor) {
                  result = false
              }
          }
          return result
      }
      
      for i in 0...100 { // you can choose whatever number you want
          if i == 0 || i == 1 {
              print("\(i) is not a prime number")
          } else if isPrime(i){
              print("\(i) is a prime number")
          } else {
              print("\(i) is not a prime numbe")
          }
      }
      
      

      【讨论】:

      • 如果您添加一个简短说明,说明为什么这种方法比其他现有答案更好或不同,答案将更有价值。
      • @Bek 你是对的。作为一个初学者,对我来说纠正自己的解决方案是一个挑战。所以我想与社区分享它作为一个有效的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多