欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

求n以内的素数

程序员文章站 2022-03-13 12:14:17
...

求n以内素数。

 

素数又称质数,它是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。

 

有两种方法:筛选法和开根号法

 

筛选法:从小到大筛去一个已知素数的所有倍数。依次删除可被2整除,3整除。。。。的数字,剩下的则为素数 。

 

开根号法:如果一个数(>2),对这个数求平方根,如果这个数能被这个数的平方根到2之间的任何一个(只要有一人就行)整除说明就不是质数,如果不能就说明是质数!


原理:假如一个数N是合数,它有一个约数a,a×b=N,则a、b两个数中必有一个大于或等于根号N,一个小于或等于根号N。因此,只要小于或等于根号N的数(1除外)不能整除N,则N一定是素数。

 

#include <iostream>
#include <cmath>
using namespace std;

void getPrime0(int);
void getPrime(int);
void getPrime2(int);
void getPrime3(int);

int main(){
    cout << "Hello world!" << endl;
    int n = 100;
    getPrime0(n); 
    getPrime(n);
    getPrime2(n);
    getPrime3(n);
    system("pause");
    return 0;
} 

//求n以内的素数
//素数又称质数,它是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。 
//算法:筛选法,从小到大筛去一个已知素数的所有倍数。依次删除可被2整除,3整除。。。。的数字,剩下的则为素数 
void getPrime0(int n){
     int i,j;
     bool m;
     for(i = 1; i <= n; i ++){
           m = true;
           for(j = 2; j < i; j ++){
                 if(i % j == 0){
                      m = false;
                      break;
                 }
           }
           if(m){
                 cout << i << " "; 
           }
     }
     cout << endl;
}

//同上 
void getPrime(int n){
    int a[n + 1];
    for(int i = 1; i < n + 1; i ++){
            a[i] = 1;//用1对数组进行标记
    }
    for(int i = 2; i < n + 1; i ++){
            for(int j = 2; j < n + 1; j ++){
                    if(a[j] == 1 && j % i == 0 && j / i != 1){//若还未标记,且是如2的倍数,并不是如2本身 
                            a[j] = 0;//非素数用0标记,最后仍未1的则为素数 
                    }
            }        
    } 
    for(int i = 1; i < n + 1; i ++){
            if(a[i] == 1){
                    cout << i << " ";
            }
    }   
    cout << endl;           
} 

//等同于getPrime(int n) 
void getPrime2(int n){
     int a[n + 1],i,j;
     for(i = 1; i < n + 1; i ++){
           a[i] = 1;
     }
     for(i = 2; i < n + 1; i ++){
           if(a[i] == 1){
                   for(j = i + i; j < n + 1; j = j + i){
                         if(j % i == 0){
                              a[j] = 0;
                         }
                   }
           }
     } 
     for(i = 1; i < n + 1; i ++){
            if(a[i] == 1){
                    cout << i << " ";
            }
    }   
    cout << endl;
}

//开根号法 
//算法:如果一个数(>2),对这个数求平方根,如果这个数能被这个数的
//平方根到2之间的任何一个(只要有一人就行)整除说明就不是质数,
//如果不能就说明是质数!
//原理:假如一个数N是合数,它有一个约数a,a×b=N
//则a、b两个数中必有一个大于或等于根号N,一个小于或等于根号N。
//因此,只要小于或等于根号N的数(1除外)不能整除N,则N一定是素数。

void getPrime3(int n){
     int a[n + 1],i,j,k;
     for(i = 1; i < n; i ++){
           k = (int)sqrt(i);
           for(j = 2; j <= k; j ++){
                 if(i % j == 0){
                      break;
                 }
           }
           if(j > k){
                cout << i << " ";
           }
     }
}

 

相关标签: 素数