2017-06-14 85 views
-3

有人能解释为什么改变“i + = 1”的顺序将“isPrime”从true改为false吗?i + = 1的顺序改变了我的代码的结果

情况1将打印出假,而情况2将打印出真实。

方案1:

let number = 643 

var isPrime = true 

var i = 2 

while i < number{ 

    i += 1 

    if number % i == 0{ 

     isPrime = false 
    } 
} 

print(isPrime) 

方案2:

let number = 643 

var isPrime = true 

var i = 2 

while i < number{ 

    if number % i == 0{ 

     isPrime = false 
    } 

    i += 1 
} 

print(isPrime) 
+0

您需要真正解释问题。此外,绝不会发布代码图片。直接将所有代码直接发布为文本。 – Carcigenicate

+1

代码的图像对我们来说毫无用处。 [This Meta post](https://meta.stackoverflow.com/a/285557/62576)有许多原因列表。所有的代码都是文本,可以很容易地复制并直接粘贴到您的问题中(并正确格式化)。 –

+0

Seyon,感谢您将屏幕图像替换为实际的代码示例! – Rob

回答

2

根据你把你的i += 1,你正在检查的最后一个数字或者是642643643 % 643等于0,而643 % 642不等于零。

原因:您正在检查i < number。现在让我们假设i642,条件满足,您进入循环并增量i,现在它是643,现在它(错误地)检查数字是否可以自行整除。如果您将该语句放到循环结尾,则您正在使用642进行计算,然后递增,现在i < number为假,并且从不检查643 % 643

小提示:您只需要检查从2号到人数的一半,因为不可能有更大的分隔:)

+0

更好的是,你只需要检查数字的平方根,因为任何可能的因素都要比小于它的因素大。 –

+0

这是一个好主意,现在你说它确实有意义(之前没有注意到它!) – Aenadon

1

不同的是,通过做i += 1第一,你在测试之前递增i的值以查看它是否可分割,因此实际上是3 ... n而不是2 ... (n-1)的测试值。由于第一个范围包括n,它错误地认为它不是素数。