📅  最后修改于: 2023-12-03 15:05:26.533000             🧑  作者: Mango
在Swift中,我们可以使用以下方法来判断一个数是否为素数:
func isPrime(_ number: Int) -> Bool {
if number <= 1 {
return false
}
for i in 2..<number {
if number % i == 0 {
return false
}
}
return true
}
上面的函数会返回true
如果传入的整数number
是素数,否则返回false
。
我们通过一个循环从2开始遍历到这个数减1,如果这个数能够被任意一个小于它的正整数整除,它就不是素数。
但是这个方法并不是最优的,我们可以使用以下的优化方法:
func isPrime(_ number: Int) -> Bool {
if number <= 1 {
return false
}
if number <= 3 {
return true
}
if number % 2 == 0 || number % 3 == 0 {
return false
}
var i = 5
while i * i <= number {
if number % i == 0 || number % (i + 2) == 0 {
return false
}
i += 6
}
return true
}
上面这个函数对于小于等于3的数直接返回true
,然后对于所有的大于3的数,首先排除2和3,因为它们是最小的素数。然后我们循环遍历6的倍数的相邻两个数(6i-1和6i+1)并检查它们是否是质数。
这个方法比第一个方法快得多。
在Swift中,我们还可以使用以下递归方法来判断一个数是否为素数:
func isPrime(_ number: Int, divisor: Int = 2) -> Bool {
if number <= 1 {
return false
}
if divisor * divisor > number {
return true
}
if number % divisor == 0 {
return false
}
return isPrime(number, divisor: divisor + 1)
}
在这个函数中,我们使用一个divisor
参数来迭代地检查这个数是否为素数。如果divisor
的平方大于这个数,就不再需要检查,因为之前的检查肯定已经包含了这种情况。在某个时刻,如果divisor
整除这个数,那么这个数就不是素数,否则我们递归调用这个函数,使用divisor+1
作为下一个除数进行检查。如果递归调用没有返回false
,那么这个数就是素数。
这种方法的好处在于:对于许多其他语言,如果我们选择非递归方法,可能会遇到堆栈溢出的问题,但是递归方法没有这个问题。
总之,Swift中有很多方法来判断一个数是否为素数。我们可以选择最适合我们需要的一种方法。