素数确定程序

0 primes swift

我的逻辑出了什么问题?9这个循环如何作为素数而非素数出现?

这可以按照0,1,2,3,4,5,6,7,8的预期工作,但挂起9 ...


var userInput = 9

if userInput == 0 {
    print("0 is not a prime number")
} else if userInput == 1 {
    print("1 is not a prime number")
} else if userInput == 2 {
    print("2 is a prime number")
} else {
    for var i = 2; i < userInput; i = i + 1 {
        if userInput % i == 0 {
            print("\(userInput) is not a prime number")
            break
        } else {
            print("\(userInput) is a prime number")
            break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

R M*_*nke 5

删除其中一个break陈述.循环需要完全运行,直到找到不是素数的条件.如果没有找到上述条件,则为素数.

var userInput = 9

if userInput == 0 {

    print("0 is not a prime number")

} else if userInput == 1 {

    print("1 is not a prime number")

} else if userInput == 2 {

    print("2 is a prime number")

} else {

    for var i = 2; i < userInput; i = i + 1 {

        if userInput % i == 0 {

            print("\(userInput) is not a prime number")
            break

        } else {

            print("\(userInput) is a prime number")
            // no break here

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者更有用:

逻辑嵌入在函数中,因此您可以使用return控制流代替break.因为return true最后你只需要寻找false条件.如果它不是一个素数,你return false用来逃避函数,return true最后将永远不会被调用.

extension Int {

    func isPrimeNumber() -> Bool {

        switch self {
        case 0 : return false
        case 1 : return false
        default :
            for i in 2..<self {
                if (self % i) == 0 {
                    return false
                }
            }
        }
        return true
    }
}

userInput.isPrimeNumber()
Run Code Online (Sandbox Code Playgroud)

该函数放在扩展名中,Int因此您只需调用该函数即可userInput.

  • 如果你正在改进他的代码,你也可以使用`switch`语句. (2认同)