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