zoukankan      html  css  js  c++  java
  • [Project Euler] Problem 50

    Problem Description

    The prime 41, can be written as the sum of six consecutive primes:

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

    This is the longest sum of consecutive primes that adds to a prime below one-hundred.

    The longest sum of consecutive primes below one-thousand that adds to a prime, contains 21 terms, and is equal to 953.

    Which prime, below one-million, can be written as the sum of the most consecutive primes?

    C++

    Here is the way:

    Firstly, we fill a integer array with primes which ranges from 1 to one million, we use the prime array to calculate later;

    Secondly, We set two pointers, one points to the first element of the array above, the other points to the position behind the last element, we assume that the longest consecutive primes are these from the start pointer to the end pointer. If not, we move the end pointer to its previous position, then check again.

    Thirdly, If we find a valid list, we record it, and add the start pointer by one and reset the end pointer which means move the end pointer to the (last element + 1) place. Repeat step 2.

    Codes:

    int* g_primeArray = NULL;
    int g_primeCount = 0;
    
    const int MAX_NUM = 1000000;
    
    void Initialize()
    {
    	g_primeCount = MAX_NUM / 5;
    	g_primeArray = new int[g_primeCount];
    	MakePrimes(g_primeArray, g_primeCount, MAX_NUM);
    
    }
    
    int CalculateSum(int* start, int* end, int& length, bool& isMax)
    {
    	isMax = false;
    	int* low = start;
    	int* high = end;
    	int sum = 0;
    	while(low < high)
    	{
    		sum += *low;
    		if(sum > MAX_NUM)
    		{
    			isMax = true;
    			sum -= *low;
    			break;
    		}
    		else
    		{
    			low++;
    		}
    	}
    	length = low - start; 
    	return sum;
    }
    
    void Problem_50()
    {
    	Initialize();
    	int maxLength = 1;
    	int maxPrime = 0;
    	int* start = g_primeArray;
    	int* end = g_primeArray + g_primeCount;
    
    	while(start < end)
    	{
    		int length = 0;
    		bool isMax = false;
    		int sum = CalculateSum(start, end, length, isMax);
    		if(length < maxLength)
    		{
    			if(isMax)
    				break;
    			start++;
    			end = g_primeArray + g_primeCount;
    			continue;
    		}
    		if(IsPrime(sum))
    		{
    			maxLength = length;
    			maxPrime = sum;
    			// printf("max length = %d, max prime = %d\n", maxLength, maxPrime);
    
    			start++;
    			end = g_primeArray + g_primeCount;
    		}
    		else
    		{
    			end = start + length - 1;
    		}
    	}
    	printf("max length = %d, max prime = %d\n", maxLength, maxPrime);
    }
    
  • 相关阅读:
    关于在centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module
    MSTP协议介绍和堆叠技术介绍
    RSTP技术详解
    5招解决路由黑洞
    系统批量运维管理器Fabric之部署LNMP业务环境
    系统批量运维管理器Fabric之动态获取远程目录列表
    系统批量运维管理器Fabric之查看远程主机信息
    系统批量运维管理器Fabric之基本语法篇
    系统批量运维管理器Fabric之环境搭建篇
    LightGBM 调参方法(具体操作)
  • 原文地址:https://www.cnblogs.com/quark/p/2555946.html
Copyright © 2011-2022 走看看