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