正文

素数缓冲求法,可重用类 2006-10-24 15:23:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/nothing/19685.html

分享到:

  #include <iostream>   #include <algorithm>   #include <vector>   #include <iterator>     template <typename T>  class PrimerCache   {       typedef T   ValueType;      typedef std::vector<ValueType> IntArray;       typedef typename IntArray::const_iterator IntPtr;          static IntArray mCache;          protected:       bool Test(ValueType num) const       {           // make sure : half  < mCache.back()           // !!! IncreaseCache(half) promised this !!!                     ValueType half = num / 2 + 1;                    for(IntPtr i = mCache.begin(); *i < half && i != mCache.end();  ++i)           {               if( num % (*i) == 0)               {                    return false;               }           }                   return true;       }          void IncreaseCache(ValueType num) const      {           ValueType upper = mCache.back();                      while (upper < num)           {               upper++;                           if( Test(upper))               {                   mCache.push_back(upper);               }                          }               }          bool InCache(ValueType num) const      {           return std::binary_search(mCache.begin(), mCache.end(), num);       }   public:       PrimerCache(ValueType lowerNum = 1000)      {           IsPrimer(lowerNum);       }          bool IsPrimer(ValueType num) const      {           ValueType biggestPrimer = mCache.back() + 1;              if( biggestPrimer > num)           {               return InCache(num);           }           else           {               IncreaseCache(num);               return Test(num);            }       }       friend std::ostream& operator<<(std::ostream& out, PrimerCache const& primerCache) -     {           IntArray& cache = primerCache.mCache;          out << "Primer Cache Has " << cache.size() << " elements, they are " << std::endl;            std::copy(cache.begin(), cache.end(), std::ostream_iterator<int>(out, ","));           return out;       }   };  //the one and only cache;  template <typename T>  typename PrimerCache<T>::IntArray PrimerCache<T>::mCache = IntArray(1, 2);     template <typename CacheType>  void TestPrimer(CacheType& cache, int num)   {       int test = num;       std::cout<< test << " is primer? "<< std::boolalpha << cache.IsPrimer(test) << std::endl;   }         int main()   {       PrimerCache<int> primer;       int test;          TestPrimer(primer, 1);       TestPrimer(primer, 2);       TestPrimer(primer, 4);       TestPrimer(primer, 5);       TestPrimer(primer, 99);       TestPrimer(primer, 97);       TestPrimer(primer, 101);       TestPrimer(primer, 102);       TestPrimer(primer, 98);       TestPrimer(primer, 96);                 std::cout << primer << std::endl;         std::cout << "primer is " << sizeof ( PrimerCache<int>) << std::endl;        PrimerCache<short> p(10);            TestPrimer(p, 1);      TestPrimer(p, 2);        std::cout << p << std::endl;      return 0;   }  

阅读(3971) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册