zoukankan      html  css  js  c++  java
  • 【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/


                   作者:gnuhpc
                   出处:http://www.cnblogs.com/gnuhpc/
                   除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


    分享到:

  • 相关阅读:
    .net 中文显示乱码问题(Chinese display with messy code)
    Compare the value of entity field.
    人见人爱A^B 题解
    人见人爱A-B 题解
    全局变量
    第39级台阶 题解
    马虎的算式 题解
    做题技巧
    inline用法
    queue函数用法
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2811980.html
Copyright © 2011-2022 走看看