C++ 求1到10^7之间素数之和的程序 (i=2;istd::vector primes={2,3,5}; 布尔校验素数(uint x){ 布尔结果=真; 用于(自动i:素数){ 如果(i*i>x){ 打破 } 如果(x%i==0){ 结果=假; 打破 } } 如果(结果){ 素数。推回(x); } 返回结果; } void get_primes(){ 对于(uint x=6;i

C++ 求1到10^7之间素数之和的程序 (i=2;istd::vector primes={2,3,5}; 布尔校验素数(uint x){ 布尔结果=真; 用于(自动i:素数){ 如果(i*i>x){ 打破 } 如果(x%i==0){ 结果=假; 打破 } } 如果(结果){ 素数。推回(x); } 返回结果; } void get_primes(){ 对于(uint x=6;i,c++,algorithm,C++,Algorithm,我建议您查看 此算法将优化您的代码。在范围内使用a,然后对找到的素数求和。2是素数。所有其他素数都是奇数,这将有效地使您必须检查的数字减半。与其检查所有数字,只需检查以前找到的素数,当然可以跳过偶数。j@MSaltersunsigned long long在j*jAnd中是不需要的,您想告诉我们什么?虽然这个代码片段可以解决这个问题,但确实有助于提高您文章的质量。请记住,您将在将来为读者回答这个问题,而这些人可能不知道您的代码建议的原因。请检查%==0仅用于“已知”素数,不是[2;sqrt(x)

我建议您查看


此算法将优化您的代码。

在范围内使用a,然后对找到的素数求和。2是素数。所有其他素数都是奇数,这将有效地使您必须检查的数字减半。与其检查所有数字,只需检查以前找到的素数,当然可以跳过偶数。
j@MSalters
unsigned long long
j*jAnd中是不需要的,您想告诉我们什么?虽然这个代码片段可以解决这个问题,但确实有助于提高您文章的质量。请记住,您将在将来为读者回答这个问题,而这些人可能不知道您的代码建议的原因。请检查%==0仅用于“已知”素数,不是[2;sqrt(x)]
for(i=2;i<=n;i++)    
{
    flag=0;

    for(j=2;j<=sqrt(i);j++) //Looping till square root of n times
    {
        if(i%j==0) 
        {
            flag=1;
            break;
        }
    }

    if(flag==0)
        sum+=i;
}
std::vector<uint> primes = {2,3,5};
bool check_prime(uint x){    
    bool result = true;
    for(auto i: primes){
        if(i*i>x){
            break;
        }
        if(x%i==0){
            result = false;
            break;
        }
    }
    if(result){
        primes.push_back(x);
    }
    return result;
}

void get_primes(){
    for(uint x =6; i<N; i++){
        check_prime(x);
    }
}

uint get_sum(){
    return std::accumulate(primes.begin(), primes.end(), 0, std::plus);
}