📜  swift基本程序中的素数或不程序 - Swift(1)

📅  最后修改于: 2023-12-03 15:05:26.533000             🧑  作者: Mango

Swift中的素数或不素数程序

在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中有很多方法来判断一个数是否为素数。我们可以选择最适合我们需要的一种方法。