Python 印 出 2 到 n 之 間 的 質數

知道一個數字是不是質數的方法是:

如果 n 不是質數,那麼 n 一定有一個小於等於 n 的因數。

所以我們可以用下面的程式判斷輸入的 n 是否為質數:

def is_prime(n):
    for i in range(2, n):
        if n % i == 0:  # 整除,i 是 n 的因數,所以 n 不是質數。
            return False
    return True     # 都沒有人能整除,所以 n 是質數。

接著回到原題:

輸入一數字 n,印出 2 到 n 之間的質數。

這代表我們要做四件事:

  1. 得到輸入值 n;
  2. 跑一個迴圈產生 2 到 n 之間的數字;
  3. 對迴圈的每個值,判斷它是不是質數;
  4. 如果是,印出來。

前兩件事很簡單:

n = int(input('Input a number: '))  # 得到輸入值 n。

for i in range(2, n + 1):   # 產生 2 到 n 的數字。
    pass
    # TODO: 做 3. 和 4.

第三件事其實就是我們前面的那個函式。所以我們直接用它:

n = int(input('Input a number: '))  # 得到輸入值 n。

for i in range(2, n + 1):   # 產生 2 到 n 的數字。
    i_is_prime = is_prime(i)    # 判斷 i 是否為質數。

第四件事情要用一個 if 來做:

n = int(input('Input a number: '))  # 得到輸入值 n。

for i in range(2, n + 1):   # 產生 2 到 n 的數字。
    i_is_prime = is_prime(i)    # 判斷 i 是否為質數。
    if i_is_prime:              # 如果是,印出來。
        print(i)

這樣就完成了。

完整的程式:

def is_prime(n):
    for i in range(2, n):
        if n % i == 0:  # 整除,i 是 n 的因數,所以 n 不是質數。
            return False
    return True     # 都沒有人能整除,所以 n 是質數。

n = int(input('Input a number: '))  # 得到輸入值 n。

for i in range(2, n + 1):   # 產生 2 到 n 的數字。
    i_is_prime = is_prime(i)    # 判斷 i 是否為質數。
    if i_is_prime:              # 如果是,印出來。
        print(i)

循環結構

如果我們需要在程式中重複執行一個動作,就可以使用循環結構。其中分為兩種,一種是for-in循環,另一種是while循環,另外也會提到break與continue。

for-in循環

當我們需要把某個變數放到某個範圍中重複做運算時,就可以用for循環,寫法如下:

'''
for 變數 in 範圍:
重複執行程式
'''

程式在執行的時候會把範圍中的元素依序代到x,然後去跑底下的程式,直到範圍內的元素被用完,程式就會停止。舉例來說:

sum=0
for x in range(11):
print(x)
sum+=1
print(sum)

一開始設定sum為0,把range中的數字0~10,依序代入x,然後去跑底下的程式,印出x,然後sum加1,迴圈結束後,印出sum,因為從0~10總共跑了11次,所以會印出11。

While循環

如果一開始不知道要循環多少次的話,就可以用While循環,設定一個條件,當符合條件時,就會不停重複執行程式,寫法如下:

'''
while 邏輯判斷 :
重複執行程式
'''

while後面接的可以是布林值,或是直接寫出邏輯運算,若True則執行循環,若False則循環結束,例如:

sum=0
x=2
while sum<10 :
x*=2
sum+=1
print(x,sum)

當sum小於10,就會跑一次裡面的程式,x乘上2並且sum加1,sum會從0開始加到9,總共10次,所以x也會乘2總共10次,最後會得到x等於2048,sum等於10。

break與continue

如果在循環中使用break關鍵字,循環會被中斷,而若使用continue則會跳過這次循環不執行,所以我們可以設定條件,如果符合某些條件,循環會被跳過或是中斷,這樣循環就可以更加靈活,舉個例子:

import randomanswer = random.randint(1, 100)
counter = 0
while True:
counter += 1
number = int(input('請猜數字: '))
if number < answer:
print('太小了')
elif number > answer:
print('太大了')
else:
print('猜對了!')
break
print('共猜了%d次' % counter)
if counter > 7:
print('太遜了')

上面的猜數字例子用random模組中取1~100之間的隨機一個數作為答案,然後用while True直接開啟循環,每猜一次counter就會加1,然後用if判斷大小,如果猜對了就用break中斷循環,最後印出總共猜了多少次,如果大於7次的話就印出「太遜了」。

不過我自己也有另外寫了一個土法煉鋼的猜數字來玩:

sum=0
s=int(input('答案'))
x=int(input('請猜數字'))
while x!=s:
if x>s:
print('太大')
sum+=1
x=int(input('請猜數字'))
else:
print('太小')
sum+=1
x=int(input('請猜數字'))
if x==s:
sum+=1
print('正確 共猜了%d次' % sum)

不過這樣的話可能要一個人出題目另一個人猜,所以說比較土法煉鋼的猜數字。

練習範例

範例一 輸入正整數判斷是否為質數

from math import sqrtnum = int(input('請輸入正整數: '))
end = int(sqrt(num))
is_prime = True
for x in range(2, end + 1):
if num % x == 0:
is_prime = False
break
if is_prime and num != 1:
print('%d是質數' % num)
else:
print('%d不是質數' % num)

另外一個有趣的找質數例子:

輸入一數字 n,印出 2 到 n 之間的質數。

'''
知道一個數字是不是質數的方法是:
如果 n 不是質數,那麼 n 一定有一個小於等於 n 的因數。
所以我們可以用下面的程式判斷輸入的 n 是否為質數:
'''
def is_prime(n):
for i in range(2, n):
if n % i == 0: # 整除,i 是 n 的因數,所以 n 不是質數。
return False
return True # 都沒有人能整除,所以 n 是質數。
'''
接著回到原題:
輸入一數字 n,印出 2 到 n 之間的質數。
這代表我們要做四件事:
1.得到輸入值 n;
2.跑一個迴圈產生 2 到 n 之間的數字;
3.對迴圈的每個值,判斷它是不是質數;
4.如果是,印出來。
前兩件事很簡單:
'''
n = int(input('Input a number: ')) # 得到輸入值 n。
for i in range(2, n + 1): # 產生 2 到 n 的數字。
pass
# TODO: 做 3. 和 4.
# 第三件事其實就是我們前面的那個函式。所以我們直接用它:
n = int(input('Input a number: ')) # 得到輸入值 n。
for i in range(2, n + 1): # 產生 2 到 n 的數字。
i_is_prime = is_prime(i) # 判斷 i 是否為質數。
# 第四件事情要用一個 if 來做:
n = int(input('Input a number: ')) # 得到輸入值 n。
for i in range(2, n + 1): # 產生 2 到 n 的數字。
i_is_prime = is_prime(i) # 判斷 i 是否為質數。
if i_is_prime: # 如果是,印出來。
print(i)
# 這樣就完成了。
# 完整的程式:
def is_prime(n):
for i in range(2, n):
if n % i == 0: # 整除,i 是 n 的因數,所以 n 不是質數。
return False
return True # 都沒有人能整除,所以 n 是質數。
n = int(input('Input a number: ')) # 得到輸入值 n。for i in range(2, n + 1): # 產生 2 到 n 的數字。
i_is_prime = is_prime(i) # 判斷 i 是否為質數。
if i_is_prime: # 如果是,印出來。
print(i)

範例二 列印三角形圖案

'''
*
**
***
****
*****
  *
**
***
****
*****
  *
***
*****
*******
*********
'''
row = int(input('請輸入行数: '))
for i in range(row):
for _ in range(i + 1):
print('*', end='')
print()
for i in range(row):
for j in range(row):
if j < row - i - 1:
print(' ', end='')
else:
print('*', end='')
print()
for i in range(row):
for _ in range(row - i - 1):
print(' ', end='')
for _ in range(2 * i + 1):
print('*', end='')
print()