我被分配了一个打印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
答案 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)
与其他答案不同,这很容易可扩展。我没有包含一个素数的预制列表,不适用于非常大的素数(未包含在内)。
这是我想出的算法。我尽可能地提高了效率,其因素仅取决于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)
}
}