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

2022-07-17 02:24:09 字數 1826 閱讀 2526

使用定理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()函式排除偶數,range(3, n, 2)這樣就減少了一半的數。

2、第二層迴圈j取值時,考慮從2開始到i開平方取值,同時也把偶數排除range(3, int(i**0.5)+1, 2)這樣也可減少一半的數。2就是質數,單獨列印。

(2)改進(1)

n = 100

print(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 = 100

print(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 ...