輸出\(n\)以內的所有質數,遍歷\([1,n]\)的所有數,每個數\(p\)都不能被\([2,p]\)整除,則為質數
針對任意數\(n\),如果有乙個數\(p(p \le \sqrt)\)是\(n\)的因子,則一定有\(u=\frac(u\geq \sqrt)\)也是它的因子,如果不存在\(p\)這樣的因子,那麼\(n\)就是質數
時間複雜度:\(o(n)\)
#include #include #include #include using namespace std;
int pri[1005];
int n;
int main()
for(int i=2;i<=sqrt(n)+1;i++)
} } for(int i=2;i<=n;i++)
return 0;
}
該演算法時間複雜度為:\(o(nloglogn)\)
當 \(n = 10^6\) 時 , 複雜度約為 \(7.7\times 10^5\),優於\(o(n)\)
//求100以內素數
#include#include#includeusing namespace std;
bool vis[101];//標記是否為素數
int prime[101];//儲存素數
int main()
} for (i=0;i質數還有乙個特點,就是它總是等於 \(6x-1\) 或者 \(6x+1\),其中 x 是大於等於1的自然數。
如何論證這個結論呢,其實不難。首先 \(6x\) 肯定不是質數,因為它能被 \(6\) 整除;其次\(6x+2\) 肯定也不是質數,因為它還能被\(2\)整除;依次類推,\(6x+3\) 肯定能被 \(3\) 整除;\(6x+4\) 肯定能被\(2\) 整除。那麼,就只有 \(6x+1\) 和 \(6x+5\) (即等同於\(6x-1\)) 可能是質數了。所以迴圈的步長可以設為 \(6\),然後每次只判斷 \(6\)兩側的數即可。
#include bool isprime(int num)
// 不在6的倍數兩側的一定不是質數
if (num % 6 != 1 && num % 6 != 5)
int sqrta = sqrt(num);
for (int i = 5; i <= sqrta; i += 6)
}return true;
}
素數判定 暴力法
總綱指路鏈結 在學習git的同時建立了乙個github倉庫,在這裡,指路。1.1 演算法描述 假設要判斷n是否為素數 判斷n是否還有除1和本身之外的因子 該方法的主要思路就是從2開始遍歷到n 1,檢視是否可以被n整除,如果找到乙個可以整除,那麼n為合數 如果沒有找到可以整除的,那麼n為素數。1.2 ...
素數判定(素數篩法)(尤拉)
這裡主要說一下素數篩法,該方法可以快速的選取出1 n數字中的所有素數。時間複雜度遠小於o n sqrt n 方法為 從2開始,往後所有素數的倍數都不是素數。最後剩下的數都是素數。再說說尤拉公式,用來解決所有小於n中的數字有多少個與n互質,用 n 表示。n n 1 1 q1 1 1 q2 1 1 qk...
素數的判定
problem description 對於表示式n 2 n 41,當n在 x,y 範圍內取整數值時 包括x,y 39 xinput 輸入資料有多組,每組佔一行,由兩個整數x,y組成,當x 0,y 0時,表示輸入結束,該行不做處理。output 對於每個給定範圍內的取值,如果表示式的值都為素數,則輸...