質數在大於1的整數中,如果只包含1和本身這兩個約數,就被稱為質數,或者叫素數。
有3中形式
由於sqrt()計算較慢。(不推薦)。
bool
is_prime
(int n)
由於i*i
有可能會大於n,而當n較大時,可能會爆int,從而成為負值。(不推薦)
bool
is_prime
(int n)
推薦 —— 試除法
bool
is_prime
(int n)
質因數是指能整除給定正整數的質數。
正整數的因數分解可將正整數表示為一連串的質因子相乘,質因子如重複可以用指數表示。
n中最多隻包含乙個大於n
\sqrt
n的質因子
void
divide
(int x)
printf
("%d %d\n"
, i, s);}
if(n >1)
printf
("%d %d\n"
, n,1)
;printf
("\n");
}
要求出從1到n中所有的質數的個數
思路是將從2到n中質數的倍數全部刪去。剩下的就是質數。
埃氏篩法
o (n
logl
ogn)
o(nlog})
o(nlog
logn
)
void
get_prime
(int x)
} cout << idx << endl;
}
線性篩法
原理:n只會被最小質因子篩掉
由於當i模primes[j]等於0時就結束,則primes[j]一定是i的最小質因子
i % pj == 0
pj 一定是i的最小質因子,pj一定是pj * i 的最小質因子。
i % pj != 0
pj一定小於i的所有質因子,pj也一定是pj*i的最小質因子。
任何乙個合數x,假設pj是x的最小質因子,當i列舉到x/pj的時候就會被篩掉
void
get_prime()
}}
數學知識 質數(質數的判定 分解質因數 篩質數)
在大於1的整數中,如果只包含1和她本身這兩個約數,那麼這個整數被稱為質數。給定n個正整數ai,判定每個數是否是質數。輸入格式 第一行包含整數n。接下來n行,每行包含乙個正整數ai。輸出格式 共n行,其中第 i 行輸出第 i 個正整數ai是否為質數,是則輸出 yes 否則輸出 no 資料範圍 1 n ...
演算法刷題 數論 質數的判定 分解質因數 篩質數
質數 在大於1的整數中,如果只包含1和它本身這兩個約數,那麼這個數就稱為質數。判斷質數最暴力的寫法,按照質數的定義 看是否有其他的因子。最樸素的暴力的時間複雜度o n 時間複雜度o n bool isprime int n 質數的判定 試除法 優化 列舉到n sqrt n 因為因數都是成對出現的,如...
質數篩以及質因數分解
今天正式學了一遍質數篩 已經可以打線性的質數篩了!以及質因數分解,要做乙個小小的總結。質數 除了1和它本身沒有其他的因數,一般指的都是正整數。篩法 篩法是一種簡單檢定素數的演算法。篩法的具體做法 給出要篩數值的範圍n,找出n以內的素數p1,p2,p3,pk。先用2去篩,即把2留下,把2的倍數剔除掉 ...