1. 程式人生 > >如何判斷素數(C++版)

如何判斷素數(C++版)

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的倍數而去掉了。所以,這個過程還有一些重複操作,演算法還有可改進的地方。