質數:在大於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 ...