质数从2 ... 100范围内打印

时间:2019-03-27 19:41:30

标签: swift

我被分配了一个打印2 ... 100范围内的质数的任务。我已经设法获得了大多数素数,但无法弄清楚如何摆脱9和15,基本上是3和5的倍数。请给我您关于如何解决此问题的建议。

for n in 2...20 {
    if n % 2 == 0 && n < 3{
        print(n)
    } else if n % 2 == 1 {
        print(n)
    } else if n % 3 == 0 && n > 6  {
    }
}

目前为止所打印的内容:

2
3
5
7
9
11
13
15
17
19

4 个答案:

答案 0 :(得分:4)

您的“算法”是错误的。您应该将素数存储在某个地方,然后只需检查n是否满足每个素数的条件n % prime != 0。如果是这样,只需将此n附加到素数数组,然后继续下一个n

从Swift 4.2开始,您可以使用allSatisfy

使用这种非常简单的算法
var primes = [Int]()

for n in 2...100 {
    if primes.allSatisfy({ n % $0 != 0 }) {
        primes.append(n)
    }
}

print(primes) // [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]

或者,您可以实施更有效的Sieve of Eratosthenes算法。

下面是我的简单实现(有一些更有效的解决方案)

var range = [Int](2...100)
var p = 0

while true {
    guard let newPrimeIndex = range.firstIndex(where: { $0 > p }) else { break }
    p = range[newPrimeIndex]
    range.removeAll(where: { $0 % p == 0 && $0 != p })
}

print(range) // [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]

答案 1 :(得分:0)

为Swift 5打造

与其他答案不同,这很容易可扩展。我没有包含一个素数的预制列表,不适用于非常大的素数(未包含在内)。

这是我想出的算法。我尽可能地提高了效率,其因素仅取决于floor的{​​{1}}的{​​{1}}。这样可以减少比较因素的浪费时间,这些因素将永远不会起作用。

square root

答案 2 :(得分:0)

什么是素数:素数是仅具有两个因数的正整数,1和整数本身,

 //Funtion Call 
findPrimeNumberlist(fromNumber: 1, toNumber: 100)

//You can print any range Prime number using this fucntion. 

func findPrimeNumberlist(fromNumber:Int, toNumber: Int)
{
 for i in fromNumber...toNumber
        {
            var isPrime = true
            if i <= 1 { // number must be positive integer
                isPrime = false 
            }
            else if i <= 3 {
                isPrime = true
            }
            else {
                for j in 2...i/2 // here i am using loop from 2 to i/2 because it will reduces the  iteration.
                {
                    if i%j == 0 { // number must have only 1 factor except 1. so use break: no need to check further 
                        isPrime = false
                        break
                    }
                }
            }
            if isPrime  {
                print(i)
            }
        }
}

答案 3 :(得分:-1)

我终于弄明白了,大声笑,它虽然不漂亮,但是可以用哈哈,谢谢大家的回答。如果可能对其他人有帮助,我会发表我的想法。

for n in 2...100 {
    if n % 2 == 0 && n < 3{
        print(n)
    } else if n % 3 == 0 && n > 6 {
    } else if n % 5 == 0 && n > 5 {
    } else if n % 7 == 0 && n > 7{
    } else if n % 2 == 1 {
        print(n)
    }
}