演算法刷題 數論 質數的判定 分解質因數 篩質數

2021-10-13 19:05:22 字數 3099 閱讀 8050

質數:在大於1的整數中,如果只包含1和它本身這兩個約數,那麼這個數就稱為質數。

判斷質數最暴力的寫法,按照質數的定義:看是否有其他的因子。

最樸素的暴力的時間複雜度o(n)

//時間複雜度o(n)

bool

isprime

(int n)

質數的判定—試除法

優化:列舉到n

\sqrt

n​,因為因數都是成對出現的,

如果d是n的因子,那麼n/d也是n的因子,所以只需要列舉一部分就行,列舉哪一部分呢?就是d≤n/d 推出,d≤n

d≤\sqrt

d≤n​

這裡n\sqrt

n​的寫法需要注意,這種呼叫數學函式n

\sqrt

n​的寫法不好,太慢;另外寫成i∗i

≤ni*i≤n

i∗i≤

n存在溢位風險,最好的寫法是i≤n

/ii≤n/i

i≤n/

i試除法求質數的時間複雜度o(n

\sqrtn​)

//優化成o(根號n)

bool

isprime

(int n)

分解質因數—試除法

暴力求質因數

下面i就是質因子,s是質因子i的階數。

暴力的時間複雜度o(n)

void

divide

(int n)

cout<

" "<

}

優化

給出乙個重要性質:正整數n的因子中,最多包含1個大於n

\sqrt

n​的質因子。(可以用反證法來證明)

這裡試除法的優化就是列舉到n

\sqrt

n​,然後剩下的1個大於n

\sqrt

n​的質因子單獨處理,這樣試除法分解質因數的時間複雜度o(n

\sqrt

n​)

ac**

#include

using

namespace std;

//試除法分解質因數

void

divide

(int n)

cout<

" "<

//單獨處理大於sqrt(n)的質因子

if(n>

1) cout<

" "<<

1<

}int

main()

}

篩質數

題目鏈結acwing868. 篩質數

樸素篩法

樸素篩法的思想:從小到大列舉所有數,每次刪掉該數的所有倍數,比如列舉到2,就刪掉所有2的倍數。列舉到3,就刪掉所有3的倍數。

需要用到prime陣列,用來存放所有的質數;st陣列,用來記錄是否是某個數的倍數,即判斷哪些是質數。需要count1變數,來儲存質數的個數。

遍歷的時候,需要考慮等號取不取。

樸素篩法的時間複雜度o(n

×log

n)o(n\times logn)

o(n×logn)

#include

using

namespace std;

const

int maxn=

1000010

;int prime[maxn]

;//prime陣列存的是從小到大的質數

int count1=0;

//質數的個數

bool st[maxn]

;//判斷是否是質數

//樸素的篩法

void

primenumber

(int n)

for(

int j=i+i;j<=n;j+

=i) st[j]

=true

;//倍數篩掉

} cout<

}int

main()

埃氏篩法

優化:不需要篩掉所有數的倍數(合數的倍數一定不是質數,不用管),只需要篩掉質數的倍數,(因為質數的倍數是合數)。

//優化的篩法

void

primenumber1

(int n)

} cout<

}

有質數定理:當n很大時,1~n中有nln

n\frac

lnnn

​個質數。

優化的篩法(埃氏篩法)時間複雜度o(n

×log

logn

)o(n\times loglogn)

o(n×lo

glog

n),可以粗略地看成是o(n)。

兩次提交結果

線性篩法

先說效率,數量級在10^7時候,線性篩法比埃氏篩法快一倍大概。

線性篩法時間複雜度o(n)

線性篩法的核心:乙個數k只會被k的最小質因子篩掉。

//線性篩法

void

primenumber2

(int n)

} cout<

}

補充

如何找到第乙個大於100000的質數呢?

解答:就是使用試除法判斷質數的方法,從100000開始遍歷,使用標誌flag,如果i不是質數,flag=false;如果i是質數,flag=true;然後判斷flag如果等於true,就break跳出迴圈,輸出i,即為大於100000的最小質數。

#include

using

namespace std;

const

int maxn=

100000

;int

main()

}if(flag)

}}

數學知識 質數(質數的判定 分解質因數 篩質數)

在大於1的整數中,如果只包含1和她本身這兩個約數,那麼這個整數被稱為質數。給定n個正整數ai,判定每個數是否是質數。輸入格式 第一行包含整數n。接下來n行,每行包含乙個正整數ai。輸出格式 共n行,其中第 i 行輸出第 i 個正整數ai是否為質數,是則輸出 yes 否則輸出 no 資料範圍 1 n ...

分解連續自然數的和 五年級數學 數論之分解質因數

鞏 gong gu 固 補充練習 互質數 公因數只有1的兩個數,叫互質數.分解質因數 把乙個合數用質因數相乘的形式表示出來,叫做分解質因數.唯一分解定理 任何乙個大於1的自然數n都可以寫成質數的連乘積,即 其中p為質數,a為非零自然數,並且這種表示是唯一的.該式稱為n的質因數分解式.1 三個自然數的...

python實現整數分解為質數的演算法

之前面試碰到過一道題,要求將整數分解為質數,用c實現看上去較為繁瑣,最近學習python,拿這道題練練手,相對於c而言,非常簡潔。廢話不多說,先上原始碼。import time def isnotin meta list for ec in list if meta ec return false ...