我正在為初學者閱讀一本關于 python 編程的書。它的任務之一是撰寫一個計算“n”個素數的素數計算器。到目前為止,我已經研究過字串、邏輯門、while 和條件。
這個想法是讓它只使用那些運算子。
我需要幫助,因為我被這段代碼困住了。
這是我所做的:
odd = 3
number = 2
limit = int(input('How many primes do you need: '))
remnant = number % odd
even_remnant = number % 2
counter = 0
while counter <= limit:
if number == 2:
print('2')
number = 2
elif (number % 2) != 0:
remnant = number % odd
while odd < number:
print('while2')
remnant = number % odd
if (number % odd) != 0 and odd == (number - 1):
print(f'{number}.')
odd = 3
number = 1
counter = 1
break
elif (number % odd) == 0:
break
odd = 2
elif (number % 2) == 0:
number = 1
odd = 3
你怎么認為?
感謝大家。
uj5u.com熱心網友回復:
穿上你的除錯褲,我們進去。
首先,代碼不會像撰寫的那樣運行。變數counter和impar未定義。第一步是洗掉這樣的語法錯誤。看起來我們想從 0 開始計數器,使用 impar 的行不是必需的,所以我們可以洗掉它。
odd = 3
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
if number == 2:
print('2')
number = 2
elif (number % 2) != 0:
while odd < number:
print('while2')
remnant = number % odd
if (number % odd) != 0 and odd == (number - 1):
print(f'{number}.')
odd = 3
number = 1
break
elif (number % odd) == 0:
break
odd = 2
elif (number % 2) == 0:
number = 1
odd = 3
現在代碼運行沒有錯誤,但它所做的只是列印
2
while2
然后無法終止。
所以我們知道我們while odd < number只進入回圈一次,并且在該回圈期間我們不列印任何內容。如果我們還在其中列印oddand的值,number我們會看到odd = 3and number = 5。兩個 if 條件都不滿足,并且該odd = 2行被命中。現在odd = 5,即使 5 是素數,while 回圈也會退出而不列印 5。如果我們想通過滿足條件來命中我們的列印陳述句,odd == (number - 1)我們最好在遞增時以 1 為步長odd。讓我們更改odd = 1并重新運行代碼。
現在,當我說我需要 2 個素數時,它會列印
2
5
7
然后while2永遠列印。至少它列印素數!但是它跳過了 3 并且列印了太多,我不得不使用 Ctrl-C 退出程式。由于while counter <= limit:從未達到外回圈條件,因此列印了太多素數。在回圈內部,我們從不增加 counter 的值。每當我們列印一個素數時,我們都需要增加計數器。
此外,為了確保我們列印 3,請查看回圈中的第一個 if 條件。
if number == 2:
print('2')
number = 2 # Oops, we skipped over 3
讓我們更新一下:
if number == 2:
print('2')
print('3')
counter = 2 # Let's count both of these!
number = 2
counter = 1在另一個列印之后添加,重新運行我們得到的代碼
How many primes do you need: 2
2
3
5.
How many primes do you need: 3
2
3
5.
7.
糟糕,我們得到的比我們需要的多。這是因為當counter == limit我們再運行一??次 while 回圈時。讓我們將 while 回圈條件更改為while counter < limit:. 這種變化讓我們得到了正確數量的素數。
How many primes do you need: 4
2
3
5.
7.
但是如果我們要求 5
How many primes do you need: 5
2
3
5.
7.
And the program never exits. If we check the values of odd and number, we see that the loops is running with odd=3 and number=9 over and over again.
Reason through the code when odd=3 and number=9. We break out of the while odd < number while loop when we hit this code
elif (number % odd) == 0
break
But we never increase the value of number, so it is still equal to 9 the next time through the loop. Let's update this to
elif (number % odd) == 0
number = 1
break
Now when we re-run the code we get
How many primes do you need: 5
2
3
5.
7.
11.
Huzzah! And it works when asking for more primes as well. Here is the code as it is currently:
odd = 3
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
if number == 2:
print('2')
print('3')
counter = 2
number = 2
elif (number % 2) != 0:
while odd < number:
if (number % odd) != 0 and odd == (number - 1):
print(f'{number}.')
odd = 3
number = 1
break
elif (number % odd) == 0:
number = 1
break
odd = 1
elif (number % 2) == 0:
number = 1
odd = 3
Now that we have working code, let's improve it! One of our bugs was that we forgot to increase number by 1 in one case. Notice that no matter how we exit the outer while loop while counter <= limit: we want to increment number. So, instead of doing it in many places, let's move all of those to the end of the while block.
We also set odd=3 whenever exiting the while block. What we want to ensure is that odd=3 at the start of the while loop, so let's move that there. Now there is no more code in the elif (number % 2) == 0: block, so we can remove that line.
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
odd = 3
if number == 2:
print('2')
print('3')
counter = 2
elif (number % 2) != 0:
while odd < number:
if (number % odd) != 0 and odd == (number - 1):
print(f'{number}.')
counter = 1
break
elif (number % odd) == 0:
break
odd = 1
number = 1
I think the code is more clear if the while loop ends when the condition is met, rather than on break statements. We want the while loop to end if we find the number is divisible by something, or we run out of numbers to check.
`while number % odd != 0 and odd < number:`
在 while 回圈中我們唯一需要做的就是增加奇數。然后在回圈之后,我們可以檢查奇數的值以查看滿足哪個條件。
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
odd = 3
if number == 2:
print('2')
print('3')
counter = 2
elif (number % 2) != 0:
while number % odd != 0 and odd < number:
odd = 1
if odd == number: # No divisor was found!
print(f'{number}.')
counter = 1
number = 1
請注意,我們正在“硬編碼”可被 2 整除(number % 2) != 0,然后使用該變數odd來檢查其他所有內容的整除性。如果我們從 2 而不是 3 開始奇數,我們就不必進行硬編碼。
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
odd = 2
if number == 2:
print('2')
print('3')
counter = 2
while number % odd != 0 and odd < number:
odd = 1
if odd == number: # No divisor was found!
print(f'{number}.')
counter = 1
number = 1
當我們進行此更改時,我們還注意到我們找到了兩次素數 2 和 3,因此我們可以洗掉它們的硬編碼版本:
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
odd = 2
while number % odd != 0 and odd < number:
odd = 1
if odd == number: # No divisor was found!
print(f'{number}.')
counter = 1
number = 1
uj5u.com熱心網友回復:
當我嘗試運行此代碼時,它告訴我未設定計數器,因此在進入回圈之前將計數器設定為 0。
另一個問題是您首先在回圈的第一種情況下找到 2,這很好。在回圈再次運行之后,現在將數字設定為 4。因為您的 = 2 指令。
然后它運行最后一個 elif 案例。其中(數字 % 2)== 0。這里設定數字 = 5,奇數 = 3。但它不列印 3。我認為你的意思是這樣做。
現在它再次運行回圈,并輸入第二個 elif case (number % 2) != 0。在 elif 子句的第一行中,變數 impar 沒有定義,所以它會失敗。
uj5u.com熱心網友回復:
要計算素數的“n”數,你不需要使用這么多陳述句,如果你使用算術和邏輯或按位運算子,你將在你正在學習的 Python 書的未來章節中學習指。
我將通過為您編輯代碼來幫助您。
number = int(input("Enter range: "))
print("Prime numbers:", end=' ')
for n in range(2, number):
for i in range(2, n):
if n % i == 0:
break
else:
print(n, end=' ')
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/406024.html
標籤:
下一篇:如何獲得所有可能組合的數量?
