确定素数

时间:2017-08-20 17:20:36

标签: swift if-statement primes

出于某种原因,它总是给我错误的结果。无论将哪个数字分配给“数字”变量,它始终为isItPrime = true

这是我的代码:

let number = 6
var i = 1
var isItPrime: Bool?
while i < number {
    if number % i == 0 {
        isItPrime = false
    } else {
        isItPrime = true
    }
    i += 1
}
print(isItPrime)

有人可以向我解释我的代码有什么问题,为什么isItPrime bool输出总是true

4 个答案:

答案 0 :(得分:4)

因为isItPrime在后续迭代中被覆盖,所以检查的最后一个数字number - 1将始终将isItPrime设置为true,因为numbernumber - 1是互质的。

不是将值保存为布尔值,而是在发现数字不是素数时结束循环:

let number = 6
var isItPrime: Bool = true
for i in 2 ..< number {
    if number % i == 0 {
        isItPrime = false
        break // end the loop, as we know that the number is not a prime.
    }
}
print(isItPrime)

答案 1 :(得分:4)

问题1

while循环的最后一次迭代

while i < number {
    if number % i == 0 {
        isItPrime = false
    } else {
        isItPrime = true
    }
    i += 1
}

会覆盖结果。

所以你总是得到以下结果

if number % (number-1) == 0 {
    isItPrime = false
} else {
    isItPrime = true
}

问题2

最后,每个号码都可以除以1,因此您应该从i开始2。 所以

let number = 6
var i = 2
var isItPrime = true
while i < number {
    if number % i == 0 {
        isItPrime = false
        break
    }
}
print(isItPrime)

重构

您可以使用函数式编程

编写类似的逻辑
let number = 5
let upperLimit = Int(Double(number).squareRoot())
let isPrime = !(2..<upperLimit).contains { number % $0 == 0 }

答案 2 :(得分:1)

它总是返回true,因为你的while循环不是按照你想要的方式工作。目前,它会循环,直到<?php $html = file_get_contents('https://tv-sewingcenter.com'); $dom = new DOMDocument; libxml_use_internal_errors(true); $dom->loadHTML($html); $jsons = array(); $scripts = $dom->getElementsByTagName('script'); if( ! empty( $scripts ) ) { foreach( $scripts as $script ) { if( $script->hasAttribute('type') && $script->getAttribute('type') == 'application/ld+json' ) { $jsons[] = json_decode($script->nodeValue, true); } } if( ! empty( $jsons ) ) { foreach( $jsons as $json ) { echo '<pre>'; print_r( $json ); echo '</pre>'; } } } i小1。在最后一次循环中,number为false,因此您的代码会将number % i == 0设置为isItPrime

要解决此问题,请尝试以下代码:

true

您可能已经注意到我将i设置为2,因为任何数字模数(%)1都是0

我认为值得指出的是:

  1. 你应该把它变成一个方法

  2. 如果您最初将isItPrime设置为let number = 6 var i = 2 var isItPrime: Bool? while (i < number || isItPrime == false) { if number % i == 0 { isItPrime = false } else { isItPrime = true } i += 1 } print(isItPrime) ,则可以免除true声明的else部分

  3. 希望这有帮助!

答案 3 :(得分:0)

在处理这类问题时,不要害怕取出一张纸并手动查看循环中发生的事情。

您的循环将从i = 1转到number = 5(因为<运算符。

考虑到这一点,我们手动执行每次迭代。

代表i = 1number = 6

6 mod 1 = 0isItPrime = false

代表i = 2number = 6

6 mod 2 = 0isItPrime = false

代表i = 3number = 6

6 mod 3 = 0isItPrime = false

代表i = 4number = 6

6 mod 4 = 2isItPrime = true

循环的最后一次迭代,适用于i = 5number = 6

6 mod 5 = 1isItPrime = true

我们可以看到问题是最后一次迭代的模块总是为1,因此导致你的else子句被执行。