ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

筛法求素数

2021-10-31 03:01:14  阅读:180  来源: 互联网

标签:筛法 int void 素数 isPrime include 1000


写法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;
}

 

标签:筛法,int,void,素数,isPrime,include,1000
来源: https://www.cnblogs.com/luyufan/p/15488188.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有