用多态计算一百以内的质数
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
- #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的倍数的数字比较多,这样可以节省运算。