搜索
查看: 887|回复: 5
打印 上一主题 下一主题

[原创] 素数搜索器

[复制链接]
楼主
发表于 2014-5-7 20:56:56 | 显示全部楼层
这个,没考虑用筛法吗
筛出1亿之内的质数1秒钟上下的事情
沙发
发表于 2014-10-8 02:09:46 | 显示全部楼层
  1. #include <bitset>
  2. #include <iostream>
  3. #include <ios>
  4. #include <vector>
  5. #include <algorithm>

  6. using std::bitset;
  7. using std::vector;

  8. bitset<100000000> buf;
  9. vector<int> prime_table;

  10. void init();

  11. int main(int argc, char **argv)
  12. {
  13.         init();
  14.         std::cout << prime_table.size() << " prime number cached, the max one is "
  15.                 << prime_table.back() << "\n";
  16.                
  17.         int required;
  18.         std::cout << "Max value?" << "\n";
  19.         std::cin >> required;
  20.        
  21.         if(required <= 100000000){
  22.                 vector<int>::iterator iter, up =
  23.                         std::upper_bound(prime_table.begin(), prime_table.end(), required);
  24.                 for(iter=prime_table.begin(); iter!=up; ++iter)
  25.                         std::cout << *iter << " ";
  26.         }
  27.         else
  28.                 std::cout << "Too big for a regular PC! Maybe next version!\n";
  29.                
  30.         return 0;
  31. }

  32. void init()
  33. {
  34.         std::ios_base::sync_with_stdio(false);
  35.        
  36.         buf[0] = buf[1] = 1;
  37.         int i = 2;
  38.         for(i=2; i<10000; ++i)
  39.                 if(buf[i] == 0){
  40.                         prime_table.push_back(i);
  41.                         buf[i] = 1;
  42.                         for(int j=i*i; j<100000000; j+=i)
  43.                                 buf[j] = 1;
  44.                 }
  45.         for(i=9999; i<100000000; i+=2)
  46.                 if(buf[i] == 0)
  47.                         prime_table.push_back(i);
  48. }
复制代码

很久之前提到的筛法代码
因为用的是bitset,编译要加-O2,不然印象中要10s以上的才能计算出一亿之内的质数

另外不要用endl,这东西的含义是换行且刷新控制台,速度很慢的
如果只是要换行应该std::cout << "\n";就可以了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表