质数确定程序
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 first 的 entire 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”)
}
我的逻辑有什么问题? 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 first 的 entire 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”)
}