【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的倍数的数字比较多,这样可以节省运算。

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

你可能感兴趣的:(C++)