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

2021-10-25 07:47:32 字數 2268 閱讀 3806

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

給定n個正整數ai,判定每個數是否是質數。

輸入格式

第一行包含整數n。

接下來n行,每行包含乙個正整數ai。

輸出格式

共n行,其中第 i 行輸出第 i 個正整數ai是否為質數,是則輸出「yes」,否則輸出「no」。

資料範圍

1≤n≤100,

1≤ai≤2∗109

輸入樣例:22

6輸出樣例:

yesno

試除法的優化:

由於某個數的約數是成對出現的,當列舉時,可以列舉一對約數中較小的,這樣可以降低時間複雜度,為了使執行的時間更短,可以將 i <= sqrt(n) 或 i * i <= n 改為 i <= n / i.

code:

#include

#include

using

namespace std;

bool

is_prime

(int n)

return

true;}

intmain()

return0;

}

給定n個正整數ai,將每個數分解質因數,並按照質因數從小到大的順序輸出每個質因數的底數和指數。

輸入格式

第一行包含整數n。

接下來n行,每行包含乙個正整數ai。

輸出格式

對於每個正整數ai,按照從小到大的順序輸出其分解質因數後,每個質因數的底數和指數,每個底數和指數佔一行。

每個正整數的質因數全部輸出完畢後,輸出乙個空行。

資料範圍

1≤n≤100,

1≤ai≤2∗109

輸入樣例:26

8輸出樣例:

2 13 1

2 3分解質因數優化難點:

如何保證列舉的 i 是質數?當列舉到 i,意味著2~(i - 1)的所有質因子已經處理完畢,即 i中不包含2~(i - 1)的質因子,則 i 一定是質數。n 中最多隻包含乙個大於sqrt(n)的質因子,在迴圈結束判斷n的值是否大於1,若滿足就輸出。

code:

#include

#include

using

namespace std;

void

divide

(int n)

cout << i <<

' '<< s << endl;}}

if(n >

1) cout << n <<

' '<<

1<< endl;

puts(""

);}int

main()

return0;

}

給定乙個正整數n,請你求出1~n中質數的個數。

輸入格式

共一行,包含整數n。

輸出格式

共一行,包含乙個整數,表示1~n中質數的個數。

資料範圍

1≤n≤106

輸入樣例:

8輸出樣例:

4code:

#include

#include

using

namespace std;

const

int n =

1000010

;int n, cnt, primes[n]

;bool st[n]

;//埃式篩法

void

get_primes1

(int n)}}

//線性篩法(所有合數x只會被它最小質因子pj刪除,且在i=x/pj處篩掉)

void

get_primes2

(int n)}}

intmain()

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

質數 在大於1的整數中,如果只包含1和它本身這兩個約數,那麼這個數就稱為質數。判斷質數最暴力的寫法,按照質數的定義 看是否有其他的因子。最樸素的暴力的時間複雜度o n 時間複雜度o n bool isprime int n 質數的判定 試除法 優化 列舉到n sqrt n 因為因數都是成對出現的,如...

判斷質數 分解質因數

質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數,質數也叫素數。與質數相對的是合數,合數是指在大於1的整數中除了能被1和本身整除外,還能被其他數整除的數。bool is prime int n 迴圈中不建議寫成i sqrt n 因為sqrt函式很慢,每次for迴圈都會執行一遍,耗...

質數篩以及質因數分解

今天正式學了一遍質數篩 已經可以打線性的質數篩了!以及質因數分解,要做乙個小小的總結。質數 除了1和它本身沒有其他的因數,一般指的都是正整數。篩法 篩法是一種簡單檢定素數的演算法。篩法的具體做法 給出要篩數值的範圍n,找出n以內的素數p1,p2,p3,pk。先用2去篩,即把2留下,把2的倍數剔除掉 ...