在大於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的倍數剔除掉 ...