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 中国大陆”许可协议授权。


    分享到:

  • 相关阅读:
    Longest Substring Without Repeating Characters
    Longest Valid Parentheses
    LInux下编译发生的libc相关错误
    【转载】字符编码笔记:ASCII,Unicode和UTF-8
    Python深入:super函数
    Python基础:常用函数
    25最小操作数问题
    24字符串最短编辑距离
    23最大乘积子串
    22倒排索引简介
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2811980.html
Copyright © 2011-2022 走看看