求100以內質數(素數)的演算法梳理

2021-08-22 16:29:05 字數 2153 閱讀 3594

以下程式都是圍繞質數的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...