对于任意正整数N,Eratosthenes筛法可表示如下:
第1步,找出小于等于√N的全部素数:p1、p2、p3、…pm。
第2步,在1~N中分别划去p1、p2、…pm全部倍数(除了他们自己本身)。
第2步完成后剩下的整数除1外就是不超过N的全部素数。
简而言之,筛选原理如下:对于一个正整数a<=N,如果素数p1、p2、…、pm(小于等于√N)都不整除a,则a是素数。
下面是C++的单链表实现:
#include <iostream>
#include<cmath>
using namespace std;
const int N(20);//设置所能求的最大数,这里为400
struct Node
{
int data;
Node *next;
};
class Eratosthenes
{
public:
Eratosthenes(int n);//将1-n按顺序生成单链表,头插法生成单链表
void Delete(Node *p);//删除p指向的节点的后一个结点
void sqrtN();//求n的平方根,并将小于√n的所有素数放入数组中
int Factorial(int n);//递归求阶乘
void De();//筛选出number中各素数的倍数,并删除,p,q指向相邻结点
void print();//输出所有素数
private:
int number[N],X,a;//储存小于√n的所有素数,X为传入的数,a记录数组实际长度
Node *p, *q,*head;
};
Eratosthenes::Eratosthenes(int n)
{
int x;
x = int(sqrt(n));
X = n;
Node *s;
head = new Node; head-&g