出于某种原因,它总是给我错误的结果。无论将哪个数字分配给“数字”变量,它始终为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
?
答案 0 :(得分:4)
因为isItPrime在后续迭代中被覆盖,所以检查的最后一个数字number - 1
将始终将isItPrime
设置为true,因为number
和number - 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)
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
}
最后,每个号码都可以除以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
我认为值得指出的是:
你应该把它变成一个方法
如果您最初将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 :(得分:0)
在处理这类问题时,不要害怕取出一张纸并手动查看循环中发生的事情。
您的循环将从i = 1
转到number = 5
(因为<
运算符。
考虑到这一点,我们手动执行每次迭代。
代表i = 1
,number = 6
6 mod 1 = 0
,isItPrime = false
代表i = 2
,number = 6
6 mod 2 = 0
,isItPrime = false
代表i = 3
,number = 6
6 mod 3 = 0
,isItPrime = false
代表i = 4
,number = 6
6 mod 4 = 2
,isItPrime = true
循环的最后一次迭代,适用于i = 5
,number = 6
6 mod 5 = 1
,isItPrime = true
我们可以看到问题是最后一次迭代的模块总是为1,因此导致你的else
子句被执行。