zoukankan      html  css  js  c++  java
  • Project Euler 50 Consecutive prime sum


    题意:

    素数41可以写成六个连续素数的和:

    41 = 2 + 3 + 5 + 7 + 11 + 13

    在小于一百的素数中,41能够被写成最多的连续素数的和。

    在小于一千的素数中,953能够被写成最多的连续素数的和,共包含连续21个素数。

    在小于一百万的素数中,哪个素数能够被写成最多的连续素数的和?

    思路:首先打出100000以内的素数表,然后计算出所有从第一个素数到 j 的和,然后枚举两个端点判断是否符合要求即可


    /*************************************************************************
        > File Name: euler050.c
        > Author:    WArobot 
        > Blog:      http://www.cnblogs.com/WArobot/ 
        > Created Time: 2017年07月01日 星期六 19时43分19秒
     ************************************************************************/
    
    #include <stdio.h>
    #include <inttypes.h>
    
    #define MAX_N 1000000
    
    int32_t prime[MAX_N + 10] = {0};
    int32_t primeList[MAX_N + 10] = {0};
    int64_t sum[MAX_N + 10] = {0};
    
    void Init() {
    	for (int32_t i = 2 ; i <= MAX_N ; i++) {
    		if (!prime[i]) {
    			primeList[++primeList[0]] = i;
    		}
    		for (int32_t j = 1 ; j <= primeList[0] ; j++) {
    			if (i * primeList[j] > MAX_N)	break;
    			prime[i * primeList[j]] = 1;
    			if (i % primeList[j] == 0)		break;
    		}
    	}
    	for (int32_t i = 1 ; i <= primeList[0] ; i++) {
    		sum[i] = sum[i - 1] + primeList[i];
    	}
    }
    int32_t main() {
    	Init();
    	int32_t maxP = 953 , maxL = 21;
    	for (int32_t i = 1 ; i < primeList[0] ; i++) {
    		for (int32_t j = i + maxL ; j <= primeList[0] ; j++) {
    			if (sum[j] - sum[i] > MAX_N)	break;
    			if (prime[sum[j] - sum[i]])		continue;
    			if (maxL < j - i){
    				maxL = j - i;
    				maxP = sum[j] - sum[i];
    			}
    		}
    	}
    	printf("maxL = %d , maxP = %d
    ",maxL , maxP);
    	return 0;
    }
  • 相关阅读:
    2017年软件工程基础-个人项目作业
    [2017BUAA软工]第1次个人作业
    [2017BUAA软工]第0次个人作业
    个人作业——软件工程实践总结&个人技术博客
    个人作业——软件评测
    结对第二次作业
    软件工程结对作业
    寒假作业(2/2)
    软件工程寒假快乐作业
    技术总结——Vue页面刷新的方法
  • 原文地址:https://www.cnblogs.com/WArobot/p/7103406.html
Copyright © 2011-2022 走看看