用多态计算一百以内的质数

来源:互联网 发布:物业公司软件 编辑:程序博客网 时间:2024/05/28 05:13

用多态计算一百以内的质数

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

view plaincopy to clipboardprint?
  1. #include <iostream>
  2. class Sieve
  3. {
  4. public:
  5. virtual int NextNumber () =0;
  6. };
  7. class SourceSieve:public Sieve
  8. {
  9. public:
  10. SourceSieve():_i(1){};
  11. int NextNumber();
  12. private:
  13. int _i;
  14. };
  15. class Sieve2: public Sieve
  16. {
  17. public:
  18. Sieve2(Sieve &src): _src(src){};
  19. int NextNumber();
  20. private:
  21. Sieve & _src;
  22. };
  23. class Sieve3: public Sieve
  24. {
  25. public:
  26. Sieve3(Sieve2 &src): _src(src){};
  27. int NextNumber();
  28. private:
  29. Sieve2 & _src;
  30. };
  31. class Sieve5: public Sieve
  32. {
  33. public:
  34. Sieve5(Sieve3 &src): _src(src){};
  35. int NextNumber();
  36. private:
  37. Sieve3 & _src;
  38. };
  39. class Sieve7: public Sieve
  40. {
  41. public:
  42. Sieve7(Sieve5 &src): _src(src){};
  43. int NextNumber();
  44. private:
  45. Sieve5 & _src;
  46. };
  47. int SourceSieve::NextNumber()
  48. {
  49. if (_i>100)
  50. {
  51. return -1;
  52. }
  53. return _i++;
  54. }
  55. int Sieve2::NextNumber()
  56. {
  57. int i;
  58. do
  59. {
  60. i = _src.NextNumber();
  61. } while (i%2==0 && i!=2 && i !=-1);
  62. return i;
  63. }
  64. int Sieve3::NextNumber()
  65. {
  66. int i;
  67. do
  68. {
  69. i = _src.NextNumber();
  70. } while (i%3==0 && i!=3 && i !=-1);
  71. return i;
  72. }
  73. int Sieve5::NextNumber()
  74. {
  75. int i;
  76. do
  77. {
  78. i = _src.NextNumber();
  79. } while (i%5==0 && i!=5 && i !=-1);
  80. return i;
  81. }
  82. int Sieve7::NextNumber()
  83. {
  84. int i;
  85. do
  86. {
  87. i = _src.NextNumber();
  88. } while (i%7==0 && i!=7 && i !=-1);
  89. return i;
  90. }
  91. int main(void)
  92. {
  93. SourceSieve src;
  94. Sieve2 s2(src);
  95. Sieve3 s3(s2);
  96. Sieve5 s5(s3);
  97. Sieve7 s7(s5);
  98. int i;
  99. for (;;)
  100. {
  101. i=s7.NextNumber();
  102. if (i==-1)
  103. {
  104. break;
  105. }
  106. std::cout<< i <<" ";
  107. }
  108. return 0;
  109. }
  110. 设计思路:
  111. 利用类的多态性质,对要除法测试的数字进行类似递归的类中传递,有一个除法测试不符合就重新取数(也就是各个类中NextNumber方法使用循环的原因),src为数字源。之所以从7->5->3->2 ->3->5>7这样的递归顺序进行是因为100以内2的倍数的数字比较多,这样可以节省运算。