POJ 3006解题报告

来源:互联网 发布:mysql 长整型 编辑:程序博客网 时间:2024/05/18 11:26

自从开始做POJ后我对1 million就没有恐惧感了,直接分配个这么大的空间来存储素数表。感觉空间换时间是个主旋律。

素数表的生成用素数筛选法(小学竞赛学到的)很快。方法是从2开始,对每个目前还标记为素数的数(初始情况下每个数都标记为素数),把它的所有倍数都标记为非素数。这些扫描过去后,一直没被标记的(即保持为素数的)就是所有的素数。

之后的事情就比较简单了,对等差序列中的每个数一个个去查预先生成的素数表,一直数到第n个素数输出即可。用时32ms。

代码如下:

#include <iostream>using namespace std;const int MAX = 1000000;bool primes[MAX];int main(){memset(primes, true, MAX);primes[1] = false;for(int i = 2; i < MAX; ++i){if(primes[i]){for(int j = 2; i * j < MAX; ++j){primes[i * j] = false;}}}/*for(int i = 2; i < 1000; ++i){if(primes[i])cout<<i<<"\t";}cout<<endl;*/int a0, d, n;while(true){cin>>a0>>d>>n;if(!a0 && !d && !n)return 0;int cnt = 0;while(true){if(primes[a0]){cnt++;if(cnt == n){break;}}a0 += d;}cout<<a0<<endl;}return 0;}


原创粉丝点击