使用定理1的基本寫法:
(1)
n = 100for i in range(2, n):
for j in range(2, i):
if i % j ==0:
break
else
:
print(i, end='
')
這種基本寫法效率不高,有2點可以改進的地方:
1、第一層迴圈的i取值時,因為偶數確定不是質數,所以排除偶數,使用range()函式排除偶數,range(3, n, 2)這樣就減少了一半的數。
2、第二層迴圈j取值時,考慮從2開始到i開平方取值,同時也把偶數排除range(3, int(i**0.5)+1, 2)這樣也可減少一半的數。2就是質數,單獨列印。
(2)改進(1)
n = 100print(2)
for i in range(3, n, 2):
for j in range(3, int(i**0.5)+1, 2):
if i % j ==0:
break
else
:
print(i, end='
')
(3)再(2)的基礎上還有優化的點,發現第一層迴圈i取值時,當i>10時,5的倍數也可排除
n = 100print(2)
for i in range(3, n, 2):
if i > 10 and i % 5 ==0:
continue
for j in range(3, int(i**0.5)+1, 2):
if i % j ==0:
break
else
:
print(i, end='
')
(4)利用定理2,用列表儲存上一次的運算結果
n = 100l = [2]for i in range(3, n, 2):
for j in
l:
if i % j ==0:
break
else
:print(l)
此種寫法的效率不高,第一層迴圈的i沒必要與列表中的每乙個元素取餘,與從2開始到i的開平方處之間的數取餘即可。
(5)改進(4)
n =100l = [2]for i in range(3, n, 2):
flag =false
for j in
l:
if i % j ==0:
flag =true
break
if j > int(i**0.5):
break
ifnot
flag:
print(l)
第二層迴圈第二個判斷處if j > int(i**0.5)
程式執行時,每次判斷i都會開平方,所以提到迴圈之外
(6)改進(5)
n = 100l = [2]for i in range(3, n, 2):
flag =false
num = int(x**0.5)
for j in
l:
if i % j ==0:
flag =true
break
if j >num:
break
ifnot
flag:
print(l)
求100以內質數(素數)的演算法梳理
以下程式都是圍繞質數的2點定理來寫的。質數定理 1 從2開始到自身的 1的數中找到乙個能整除的 從2開始到自身開平方的數中找到乙個能整除的 2 乙個合數一定可以分解成幾個質數的乘積,也就是說,乙個數如果能被乙個質數整除就是合數。使用列表儲存質數 使用定理1的基本寫法 這種基本寫法效率不高,有2點可以...
python 求100以內素數 質數和
import math def is prime n 簡化問題,先利用函式判斷是否為質數 if n 1 是賦值,才是判斷,切記切記 return false for i in range 2,int math.sqrt n 1 質數判斷條件,注意 1 if n i 0 return false re...
一 求100以內的素數
我們通過變數i來表示1到100的任意乙個數,那麼判斷i是不是素數即可。素數就是除去1和它自身沒有其它的因數的數。可以通過兩層迴圈來判斷i是不是素數。package basedatatype author administrator 求100以內的素數 public class variate if ...