如何判斷素數(C++版)
阿新 • • 發佈:2019-02-03
1.對於判斷一個數n是否為素數,最樸素的方法是按素數的定義,試除以從2開始到m-1的整數,如果無一例外地不能整除,則該數一定是素數。
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
for(int i=2; i<n; i++){
if(n%i == 0){
cout << n << " isn't a prime" << endl;
return 1;
}
}
cout << n << " is a prime" << endl;
return 0;
}
2.想一想,若2都不能除盡,還要試4, 6, 8, …嗎?若3都不能除盡,還要試9, 15, 21, …嗎?等等。一個數,如果有因子的話,那麼在它的平方根數以內就應該有,否則就沒有因子。所以必定有一個因子不大於m的平方根。故判斷m是否為素數,只要試除到m的平方根就可以了,不必一直到m-1。
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int n;
cin >> n;
for(int i=2; i<=sqrt(n); i++){
if(n%i == 0){
cout << n << " isn't a prime" << endl;
return 1;
}
}
cout << n << " is a prime" << endl;
return 0;
}
3.另一種判斷素數的方法–篩法。從檔案prime.txt中讀入一些整數,然後判斷其是否為素數。從2開始的某個連續整數集合,留下2,除去所有2的倍數,留下3,除去所有3的倍數,留下5,再除去所有5的倍數,如此等等。留下某個最先遇到的素數,將其所有的倍數從該數集中去掉。最後,數集中就全是素數了。接下來,要判斷一個數是否為素數,可以該數為下標,訪問素數集合。如果是,則為素數,否則不是素數。
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(){
vector<int> prime(10000, 1);
for(int i=2; i<100; i++){
if(prime[i]){
for(int j=i; i*j<10000; j++)
prime[i*j] = 0;
}
}
ifstream in("prime.txt");
for(int k; in>>k && k>1 && k<10000; )
cout << k << " is " << (prime[k] ? "":"not ") << "a prime." << endl;
return 0;
}
程式中,先將10000個向量元素都賦初值1,凡是該下標的元素為1的,則為素數。所以初始狀態下,所有整數都是素數,在這基礎上將不是素數的數篩掉(將對應元素置0)。在篩的過程中,用了“若為素數,必有因子小於其平方根”的思想,10000個數,過濾因子只要到100,就能保證10000以內全是素數了。
在程式中,對於3來說,要去掉所有3的因子,包括6、12、18等,但事實上,偶數在上一輪中已經作為2的倍數而去掉了。所以,這個過程還有一些重複操作,演算法還有可改進的地方。