Java教程

筛法求素数

本文主要是介绍筛法求素数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

写法1:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
void shift(int* isPrime, int n, int i)
{
    for (int j = 2 * i; j < n; j += i)
        isPrime[j] = 0; //划掉不是素数的数
}
int main() 
{
    int outnum = 1;
    int isPrime[1000];
    //假定1~100都是素数
    memset(isPrime, 1, 1000*sizeof(int)); //初始化数组所有元素为1

    //求素数
    for (int i = 2; i < sqrt(1000); ++i)
    {
        if (isPrime[i])
            shift(isPrime, 1000, i);
    }

    //输出素数
    for (int j = 2; j < 1000; ++j)
    {
        if (isPrime[j])
        {
            printf("%d ", j);
            outnum++;
            if (outnum % 10 == 0)
                printf("\n");
        }
    }
    system("pause");
    return 0;
}

方法2—类

#include <iostream>
#include <cstring>
#include <cmath>

class ShowPrime{
public:
   ShowPrime(): isPrime(NULL),n(0){ } //构造函数,创建对象使用
   void display(int n){ //显示小于n的素数成员函数,开放
       solvePrime(n);   // 成员变量 isPrime 存储小于n的素数  封装
       show(n);         // 显示小于n的素数     封装
   }
   ~ShowPrime(){ delete []isPrime; } //析构释放空间
   
private: //封装的成员函数
   void solvePrime(int n){    
       if(this->n < n){  //假如isPrime存储的素数是大于 n 的,不再需要计算        
           init(n);      //创建isPrime空间,赋值为1   
           for(int i=2; i<sqrt(n);++i) // 筛法求素数
               if(isPrime[i]) shift(i);
       }        
   }
   void init(int n){
       delete []isPrime; //释放之前的空间  C++规定 可以delete 空指针(第一次计算是空指针)
       this->n = n;           //更新空间大小
       isPrime = new int[n];  //创建 n 大小空间
       memset(isPrime,1,n*sizeof(int)); //并把空间赋值1
   }
   void shift(int i){  //划掉不是素数的数
       for(int j=2*i; j<n; j+=i)
           isPrime[j] = 0; 
   }
   void show(int n){ //显示小于n的素数
       for(int j=2; j<n; ++j)
           if(isPrime[j])
               printf("%d ", j);
       printf("\n");
   }
   
private: 
   int n; //isPrime的空间大小
   int *isPrime; // 指针,创建空间,存储小于n的素数
};

int main()
{
   ShowPrime sp;   //创建一个对象
   sp.display(50); //对象调用显示小于50的素数
   sp.display(100);//对象调用显示小于100的素数
   
   return 0;
}

 

这篇关于筛法求素数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!