POJ_2262

思路:

    线性筛选,计算出所有的小于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 1000000
bool 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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值