zoukankan      html  css  js  c++  java
  • 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
    ",i);
    			break;
    		}
    	}
    	printf("end
    ");
    	return 0;
    }
  • 相关阅读:
    Loadrunner的Tuxedo脚本分析,基本流程和基本函数介绍
    安装ArcGIS Server 9.2的一些建议
    .obj,.lib,.dll,.h之间的相互关系
    中国Albers 投影参数设置参考资料
    投影常识
    vc++2005环境中静态调用DLL(隐式)
    设置GDAL_DATA环境变量
    开源代码搜索利器Koders
    更正GDAL_DATA设置一文错误
    2007年的元宵节
  • 原文地址:https://www.cnblogs.com/WArobot/p/7099007.html
Copyright © 2011-2022 走看看