自昨天以来,我一直在为此苦苦挣扎,如何创建一个具有质数列表并返回“质数+真/假”的函数 例如:
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(代码= EXC_I386_INVOP,子代码= 0x0)。
答案 0 :(得分:0)
如果对您来说有意义,请参见下面的答案:
func isPrime(_ number: Int) -> String {
return "\(number) \(number > 1 && !(2..<number).contains { number % $0 == 0 })"
}
func PrimeList(maxP:Int) {
var array = [String]()
for number in 0...maxP {
array.append(isPrime(number))
}
print(array)
}
调用方法:
PrimeList(最大值:20)
答案:
[“ 0假”,“ 1假”,“ 2真”,“ 3真”,“ 4假”,“ 5真”,“ 6” false”,“ 7 true”,“ 8 false”,“ 9 false”,“ 10 false”,“ 11 true”,“ 12 false”,“ 13 true”,“ 14 false”,“ 15 false”,“ 16 false”,“ 17 true”,“ 18 false”,“ 19 true”,“ 20 false”]
答案 1 :(得分:0)
您的程序崩溃,因为您无法在Swift中索引到空数组。您应该使用append
将项目添加到数组中。
尽管不是通过附加项目来创建数组,但这里是使用map
的理想场所:
func primeList(maxP: Int) -> [(num1: Int, num2: Bool)] {
return (1...maxP).map { ($0, primecheck(numbers: $0)) }
}
说明:
map
创建一个数组。在这种情况下,它将取(1...maxP)
范围内的每个项目,并使用提供的闭包将其转换为原始值的 tuple 以及使用该值调用primecheck
的结果。结果是所需的数组,其值与布尔值配对,表明它们是否为素数。
可以使用primecheck
立即guard
清除不大于return false
的数字来清理1
函数。如果找到一个将输入均分的数字,则可以立即return false
;如果找不到,则立即return true
。
func primecheck (numbers:Int) -> Bool {
guard numbers > 1 else { return false }
for i in 2..<numbers {
if numbers % i == 0 {
return false
}
}
return true
}
注释:
primecheck
时放弃除数的检查来进一步优化i * i > numbers
。在guard i * i <= numbers else { return true }
循环的顶部添加for
。或者,将除数范围的上限设置为Int(sqrt(Double(numbers)))
。2...numbers - 1
已被重写为2..<numbers
。答案 2 :(得分:0)
您可以使用map
或reduce(into:_:)
方法来生成元组的primeList数组。
使用y
reduce(into:_:)
您无需检查func primeList(maxP:Int) -> [(num1:Int, num2:Bool)] {
return (1...maxP).reduce(into: [(num1:Int, num2:Bool)](), { $0.append((num1:$1, num2:primecheck(number:$1))) })
}
即可确定数字是否为质数。您可以检查直到n-1
的{{1}}
square root