质数确定程序

Prime number determination program

我的逻辑有什么问题? 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
        }
    }
}

删除其中一个 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

        }
    }
}

或者更有用一点:

逻辑嵌入在函数中,因此您可以使用 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()

该函数位于 Int 的扩展中,因此您可以从 userInput 调用该函数。

这个逻辑有缺陷:

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
    }
}

if-else 是错误的。相反,您需要循环遍历 for-loop firstentire if 部分,测试每个数字是否是一个因素(if userInput % i == 0),一遍又一遍; 然后并且只有然后,如果你已经完成循环并且仍然没有发现一个因素,可以你声明这一定是素数。

但是,如果像您所做的那样将所有内容都设置在平坦的顶层,您会发现很难成功编写该逻辑。问题是当你处于顶层时,你没有办法真正退出。因此,您的逻辑要求您将所有内容都放在一个函数中,您可以通过说 return.

来强制提前退出

在这次重写中,我已经做到了,而且我使用了 switch 比你的 if...else if:

func testForPrime(userInput:Int) {
    switch userInput {
    case 0: print("0 is not a prime number")
    case 1: print("1 is not a prime number")
    case 2: print("2 is a prime number")
    default:
        for i in 2..<userInput {
            if userInput % i == 0 {
                print("\(userInput) is not a prime number")
                return
            }
        }
        print("\(userInput) is a prime number")
    }
}

测试方法如下:

for i in 0...20 {testForPrime(i)}

输出:

0 is not a prime number
1 is not a prime number
2 is a prime number
3 is a prime number
4 is not a prime number
5 is a prime number
6 is not a prime number
7 is a prime number
8 is not a prime number
9 is not a prime number
10 is not a prime number
11 is a prime number
12 is not a prime number
13 is a prime number
14 is not a prime number
15 is not a prime number
16 is not a prime number
17 is a prime number
18 is not a prime number
19 is a prime number
20 is not a prime number

(另请注意,我使用了 Swift-style for-loop 而不是您的 C-style for-loop。您应该习惯 Swift样式,因为 C-style for-loop 将很快从语言中删除。)

我的解决方案在评论框中看起来很糟糕。我有 re-pasted 他们在这里。再次感谢您的帮助!


var uI = 9

var isPrime = true

if uI == 0 || uI == 1 {

    isPrime = false

}

for var i = 2; i < uI; i++ {

    if uI % i == 0 {

        isPrime = false  
    }
}

if isPrime {

    print("\(uI) is prime!")

} else {

    print("\(uI) is not prime”)

}

var uI = 11

var isPrime = true

if uI == 0 || uI == 1 {

    isPrime = false

}

var i = 2

while i < uI {

    if uI % i == 0 {

        isPrime = false

    }
    i++

}

if isPrime {

    print("\(uI) is prime!”)

} else {

    print("\(uI) is not prime”)

}