我正在努力解决一个挑战问题,即总计200万以下的所有素数。完全了解一个天真的方法将花费太长时间,我决定实施The Eratosthenes Sieve with a counter来记录总和。它适用于高达512500,之后我收到此错误:
输入大小是否太大而无法处理代码?如果是这种情况,我如何改进我的代码以避免此错误。如果那是不可能的,那么为实现这些目的而实施的更好的算法是什么?
这是我的标题代码:
#ifndef NUMBERSIEVE_H
#define NUMBERSIEVE_H
class NumberSieve
{
public:
NumberSieve();
virtual ~NumberSieve();
int EratosthenesSieve(int num);
private:
void SetSieve(int nums[],int Size);
int current_prime;
int current_prime_address;
void updateSieve(int nums[],int Size,int start);
bool updateCurrentPrime(int nums[],int Size,int start);
bool notComplete;
void printSieve(int nums[],int Size);
int primeSum;
};
#endif // NUMBERSIEVE_H
这是我的实施文件:
#include "NumberSieve.h"
#include <cstdlib>
#include <iostream>
NumberSieve::NumberSieve()
{
//ctor
}
NumberSieve::~NumberSieve()
{
//dtor
}
void NumberSieve::SetSieve(int nums[],int Size)
{
for(int i=0;i<Size;i++)
{
nums[i]=(i+1);
}
nums[0]=0;//Sets the first composite number 1 to 0. We use 0 as an analogy for "crossing out numbers in the Sieve".
}
void NumberSieve::updateSieve(int nums[],int Size,int start)
{
int CURRENT_PRIME=nums[start];
for(int i=start;i<Size;i++)
{
if(nums[i]%CURRENT_PRIME==0)
{
nums[i]=0;
}
}
nums[start]=CURRENT_PRIME;
}
bool NumberSieve::updateCurrentPrime(int nums[],int Size,int start)
{
for(int i=start+1;i<Size;i++)
{
if(nums[i]!=0)
{
primeSum+=nums[i];
current_prime=nums[i];
current_prime_address=i;
return true;
}
}
return false;
}
void NumberSieve::printSieve(int nums[],int Size)
{
for(int i=0;i<Size;i++)
{
std::cout<<nums[i]<<std::endl;
}
}
int NumberSieve::EratosthenesSieve(int num)
{
int Eratosthenes[num];
int primeSum=0;
SetSieve(Eratosthenes,num);
current_prime=2;
primeSum+=2;
current_prime_address=1;
updateSieve(Eratosthenes,num,current_prime_address);
notComplete=updateCurrentPrime(Eratosthenes,num,current_prime_address);
while(notComplete)
{
updateSieve(Eratosthenes,num,current_prime_address);
notComplete=updateCurrentPrime(Eratosthenes,num,current_prime_address);
}
return primeSum;
}
答案 0 :(得分:2)
我最好的猜测是stackoverflow,因为:
clipTo()
而是尝试从免费商店获取它:
int Eratosthenes[num];
相应地更新其余代码
如果你对指针感到不舒服,可能是另一种选择。