Project Euler 46 Goldbach's other conjecture( 线性筛法 )


题意:

克里斯蒂安·哥德巴赫曾经猜想,每个奇合数可以写成一个素数和一个平方的两倍之和

9 = 7 + 2×12
15 = 7 + 2×22
21 = 3 + 2×32
25 = 7 + 2×32
27 = 19 + 2×22
33 = 31 + 2×12

最终这个猜想被推翻了。

最小的不能写成一个素数和一个平方的两倍之和的奇合数是多少?

思路:用线性筛法记录下来所有素数,然后去生成在范围内的哥德巴赫数字即可


/*************************************************************************
    > File Name: euler046.c
    > Author:    WArobot 
    > Blog:      http://www.cnblogs.com/WArobot/ 
    > Created Time: 2017年06月29日 星期四 12时51分48秒
 ************************************************************************/

#include <stdio.h>
#include <inttypes.h>

#define MAX_N 100000

int32_t IsPrime[MAX_N + 10] = {0} , primeList[MAX_N + 10] = {0};
int32_t GoldbachNum[MAX_N + 10] = {0};

void Init() {
	for (int32_t i = 2 ; i <= MAX_N ; i++) {
		if (!IsPrime[i]) { primeList[ ++primeList[0] ] = i; }
		for (int32_t j = 1 ; j <= primeList[0] ; j++) {
			if (i * primeList[j] > MAX_N)	break;
			IsPrime[i * primeList[j]] = 1;
			if (i % primeList[j] == 0)		break;
		}
	}
	for (int32_t i = 1 ; i <= primeList[0] ; i++) {
		for (int32_t j = 1 ; true ; j++) {
			if (primeList[i] + 2 * j * j > MAX_N)	break;
			GoldbachNum[primeList[i] + 2 * j * j] = 1;
		}
	}
}
int32_t main() {
	Init();
	for (int32_t i = 33 ; i <= MAX_N ; i += 2) {
		if (!IsPrime[i])	continue;
		if (!GoldbachNum[i]) {
			printf("ans = %d\n",i);
			break;
		}
	}
	printf("end\n");
	return 0;
}
posted @ 2017-06-30 15:21  ojnQ  阅读(275)  评论(0编辑  收藏  举报