我的逻辑出了什么问题? 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
}
}
}
答案 0 :(得分: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
}
}
}
或者更有用:
逻辑嵌入在函数中,因此您可以使用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
调用该功能即可。
答案 1 :(得分:4)
这种逻辑是有缺陷的:
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循环首先的整个 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风格的for循环而不是C风格的for循环。你应该习惯Swift风格,因为C风格的for循环将从语言很快。)
答案 2 :(得分:1)
我的解决方案在评论框中看起来很糟糕。我在这里重新粘贴了它们。再次感谢您的帮助!
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”)
}