求一百以内的质数

#include <iostream>

class Sieve
{
public:
virtual int NextNumber () =0;
};

class SourceSieve:public Sieve
{
public:
SourceSieve():_i(1){};
int NextNumber();
private:
int _i;
};

class Sieve2: public Sieve
{
public:
Sieve2(Sieve &src): _src(src){};
int NextNumber();
private:
Sieve & _src;
};

class Sieve3: public Sieve
{
public:
Sieve3(Sieve2 &src): _src(src){};
int NextNumber();
private:
Sieve2 & _src;
};

class Sieve5: public Sieve
{
public:
Sieve5(Sieve3 &src): _src(src){};
int NextNumber();
private:
Sieve3 & _src;
};

class Sieve7: public Sieve
{
public:
Sieve7(Sieve5 &src): _src(src){};
int NextNumber();
private:
Sieve5 & _src;
};

int SourceSieve::NextNumber()
{
if (_i>100)
{
return -1;
}

return _i++;
}

int Sieve2::NextNumber()
{
int i;
do
{
i = _src.NextNumber();
} while (i%2==0 && i!=2 && i !=-1);
return i;
}

int Sieve3::NextNumber()
{
int i;
do
{
i = _src.NextNumber();
} while (i%3==0 && i!=3 && i !=-1);
return i;
}

int Sieve5::NextNumber()
{
int i;
do
{
i = _src.NextNumber();
} while (i%5==0 && i!=5 && i !=-1);
return i;
}

int Sieve7::NextNumber()
{
int i;
do
{
i = _src.NextNumber();
} while (i%7==0 && i!=7 && i !=-1);
return i;
}

int main(void)
{
SourceSieve src;
Sieve2 s2(src);
Sieve3 s3(s2);
Sieve5 s5(s3);
Sieve7 s7(s5);

int i;

for (;;)
{
i=s7.NextNumber();
if (i==-1)
{
break;
}

std::cout<< i <<" ";
}

return 0;
}

设计思路:

利用类的多态性质,对要除法测试的数字进行类似递归的类中传递,有一个除法测试不符合就重新取数(也就是各个类中NextNumber方法使用循环的原因),src为数字源。之所以从7->5->3->2 ->3->5>7这样的递归顺序进行是因为100以内2的倍数的数字比较多,这样可以节省运算。

你可能感兴趣的:(质数)