以下程式都是圍繞質數的2點定理來寫的。
質數定理:
1、從2開始到自身的-1的數中找到乙個能整除的(從2開始到自身開平方的數中找到乙個能整除的)。
2、乙個合數一定可以分解成幾個質數的乘積,也就是說,乙個數如果能被乙個質數整除就是合數。(使用列表儲存質數)
使用定理1的基本寫法:
這種基本寫法效率不高,有2點可以改進的地方:
1、第一層迴圈的i取值時,因為偶數確定不是質數,所以排除偶數,使用range()
函式排除偶數,range(3, n, 2)
這樣就減少了一半的數。
2、第二層迴圈j取值時,考慮從2開始到i開平方取值,同時也把偶數排除range(3, int(i**0.5)+1, 2)
這樣也可減少一半的數。2就是質數,單獨列印。
(2)
改進(1):
n = 100
print(2)
fori in range(3, n, 2):
forj in range(3, int(i**0.5)+1, 2):
ifi% j == 0:
break
else:
print(i, end=' ')
(3)
再(2)的基礎上還有優化的點,發現第一層迴圈i取值時,當i>10時,5的倍數也可排除。
n = 100
print(2)
fori in range(3, n, 2):
ifi > 10 and i
% 5 == 0:
continue
fori in range(3, int(i**0.5)+1, 2):
ifi% j == 0:
break
else:
print(i, end=' ')
(4)
利用定理2,用列表儲存上一次的運算結果。
n = 100
l = [2]
fori in range(3, n, 2):
forj in l:
ifi% j == 0:
break
else:
print(l)
此種寫法的效率不高,第一層迴圈的i沒必要與列表中的每乙個元素取餘,與從2開始到i的開平方處之間的數取餘即可。
(5)
改進(4):
n =100
l = [2]
fori in range(3, n, 2):
flag = false
forj in l:
ifi% j == 0:
flag = true
break
ifj > int(i**0.5):
break
if not flag:
print(l)
第二層迴圈第二個判斷處if j > int(i**0.5)
程式執行時,每次判斷i都會開平方,所以提到迴圈之外。
(6)
改進(5):
n = 100
l = [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以內的素數(質數)演算法梳理
使用定理1的基本寫法 1 n 100 for i in range 2,n for j in range 2,i if i j 0 break else print i,end 這種基本寫法效率不高,有2點可以改進的地方 1 第一層迴圈的i取值時,因為偶數確定不是質數,所以排除偶數,使用range ...
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...
篩法 求n以內質數個數
判斷n是否為素數 續篩法部分 區間篩法 若乙個數可以進行因數分解,則得到的兩個數一定是有乙個 x sqrt x x 另乙個 x sqrt x x 任何乙個數都可以拆分為若干個質因數的乘積,如6 2 3,7 1 7 複雜度o nn sqrt n n include using namespace st...