【C++习作】用多态计算一百以内的质数
作者: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的倍数的数字比较多,这样可以节省运算。