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

[原创] 素数搜索器

[复制链接]
跳转到指定楼层
楼主
发表于 2014-5-3 14:30:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Prime.tar.gz (1 KB, 下载次数: 14)
这是我自己做的素数搜索器。
理论上来说可以把2~unsigned long long最大值的素数全找到。
发布的文件里有源码,还附上了Makefile
make(或用C++编译器编译)后有个PrimeFinder是主程序,使用方法:在终端或cmd中运行(在windows系统上,点一下就行),然后输入需要找到的最大数的值,然后程序就会把2~你所需的数中的素数打印在Primes.txt里
Primes.txt不要删除
因为当搜索到了很多素数后,用文本编辑器打开Primes.txt变得需要耗费大量时间,所以有ViewLast这一个程序帮我们迅速查看当前文件里的最后(也是最大的一个素数)这个程序运行时需要由操作系统传入文件名作为参数
沙发
 楼主| 发表于 2014-5-3 14:33:04 | 只看该作者
请各位高手指导(优化)
板凳
发表于 2014-5-7 18:29:00 | 只看该作者
{:soso__3669389859068460655_4:}
地板
发表于 2014-5-7 20:37:12 | 只看该作者
981013 发表于 2014-5-3 14:33
请各位高手指导(优化)

关于素数的优化,《编程珠玑(续)》中第一章第一节的P6算是最优化的吧~~!
5#
发表于 2014-5-7 20:56:56 | 只看该作者
这个,没考虑用筛法吗
筛出1亿之内的质数1秒钟上下的事情
6#
发表于 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";就可以了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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