如何创建给出素数+ bool值的函数?

时间:2019-05-31 14:24:45

标签: arrays swift tuples

自昨天以来,我一直在为此苦苦挣扎,如何创建一个具有质数列表并返回“质数+真/假”的函数 例如:

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)。

3 个答案:

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

注释:

  1. 您可以通过在primecheck时放弃除数的检查来进一步优化i * i > numbers。在guard i * i <= numbers else { return true }循环的顶部添加for。或者,将除数范围的上限设置为Int(sqrt(Double(numbers)))
  2. 2...numbers - 1已被重写为2..<numbers
  3. 函数名称应以小写字母开头。

答案 2 :(得分:0)

您可以使用mapreduce(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