您的位置:首页 > 编程语言 > C语言/C++

【C++习作】用多态计算一百以内的质数

2012-12-10 21:00 411 查看
作者: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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: