【发布时间】:2019-05-31 14:24:45
【问题描述】:
从昨天开始我一直在为此苦苦挣扎,如何创建一个包含素数列表并返回“素数 + 真/假”的函数 例如:
2 真 3 对 4 假 5 对
它在 Swift 5 中,第一个函数 primecheck 运行良好,问题出在第二个函数 PrimeList
func primecheck (numbers:Int) -> Bool{
var prime = true
if numbers == 1 || numbers == 0 || numbers == 2{
prime = true
}
if numbers > 2{
for i in 2...numbers - 1{
if numbers % i == 0 {
prime = false
}
}
}
if numbers == 1 || numbers == 0 || numbers == 2{
prime = true
}
if numbers < 0{
prime = false
}
return prime
}
func PrimeList(maxP:Int) -> [(num1:Int, num2:Bool)] {
var primes: [(num1:Int, num2:Bool)] = []
for i in 1...maxP {
if primecheck(numbers:i){
print(i)
primes[i - 1] = (i, true)
} else {
primes[i - 1] = (i, false)
}
}
// isPrime[0] = true
// isPrime[1] = true
return primes
}
print(PrimeList(maxP:20))
预期输出:
print(primeList(maxP:20))
// 2 true
// 3 true
// 4 false
...
// 20 false
但总是出现这个错误:
执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)。
【问题讨论】:
-
改用
primes.append((i, true))和primes.append((i, false)),或直接使用primes.append((i, primecheck(numbers: i))) -
0 和 1 根据定义不是素数
-
让我们简化您的情况:
var array: [Int] = []; array[0] = 3这是同样的错误,在控制台中,还有一个有趣的消息:“致命错误:索引超出范围”。阅读array[0] = 3,如:给我索引 0 处的项目,并将其替换为值 3。好吧,“给我索引 0 处的项目”会导致崩溃(并且该日志是有道理的)。 -
这里的简单解决方案当然是在结果数组中只包含素数的数字而忘记这个布尔值