POJ_2262

来源:互联网 发布:js获取title属性 编辑:程序博客网 时间:2024/06/07 05:09

思路:

    线性筛选,计算出所有的小于1000000的素数,然后从头开始查找,找到的第一组就是差最大的。

notes:

    提交的时候用c++明显要快,wa了很多次,但是把数组开成全局的并且使用宏定义替换了全局常量就ac了,被坑的很惨。

优化:

    第一次写筛选法的时候,TLE了,后来进行了优化,优化的思路可以参考“筛法求质”http://blog.csdn.net/redraiment/article/details/2072005。

    1. 除了2以外, 所有素数都是odd,因此可以先筛掉除2之外的所有偶数,之后再写筛选法的时候,从3开始,以+2为步长。

    2. 判断一个数x是素数, 只需要x不能被小于等于sqrt(x)的所有素数整除就可以了。

    3. 在使用一个素数x进行筛选的时候,因为2x, 3x, ......一直到比x小的上一个素数*x都已经在之前被筛选掉了,因此,可以从x * x开始进行筛选。

    4. (代码中没有使用)除了2,所有的素数都是odd,所以x * x是odd,如果i是odd的话,则x * x + i * x是偶数已经被2筛选掉了,因此可以用+2x为步长。

//c++: 1108k  94ms//g++: 1332k  313ms#include <cstdio>#include <cstdlib>#include <cstring>#define MAX 1000000bool prim[MAX];int main() {  memset(prim, 1, MAX);  prim[0] = prim[1] = 0;  for (int i = 4; i < MAX; i += 2)    prim[i] = 0;  for (int i = 3; i * i < MAX; i += 2) {    if (!prim[i])      continue;    for (int j = i * i; j < MAX; j += i)      prim[j] = 0;  }  int even;  while (scanf("%d", &even) && even) {    int i;    for (i = 3; i <= even / 2; i += 2 ) {      if (prim[i] && prim[even - i]) {        printf("%d = %d + %d\n", even, i, even - i);        break;      }    }    if (i > even / 2)      printf("Goldback's conjecture is wrong.\n");  }  return 0;}


原创粉丝点击