2017-06-14 109 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,它錯誤地認爲它不是素數。