首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >项目Euler #10 [C++]素数小于2000000的和

项目Euler #10 [C++]素数小于2000000的和
EN

Stack Overflow用户
提问于 2022-07-19 19:15:32
回答 1查看 98关注 0票数 -1

提示:小于10的素数之和为2+3+5+7= 17。找到2百万以下素数之和。

代码:

代码语言:javascript
复制
#include <iostream>
#include <list>

/**
 * @brief Searches for numbers that in a that can be factored by b
 * 
 * @param a list of numbers
 * @param b factorable number
 */
void search(std::list<long long>& a, long long b, std::list<long long>::iterator c);

int main() {
    std::list<long long> nums;
    long long range = 0;
    long long PrimesSum = 0;

    std::cout << "Sum all the primes up to: ";
    std::cin >> range;

    for (int i = 2; i <= range; i++) {
       nums.push_back(i);
    }

    for (std::list<long long>::iterator it = nums.begin(); it != nums.end(); it++) {
        search(nums,*it,it);
    }
    
    for (std::list<long long>::iterator it = nums.begin(); it != nums.end(); it++) {
        PrimesSum+=*it;
    }
    std::cout << "The sum of all primes below " << range << " is " << PrimesSum << ".\n";
}

void search(std::list<long long>& a, long long b, std::list<long long>::iterator c) {
    std::list<long long>::iterator it = c;
    while (it != a.end()) {
        if (*it % b == 0 && *it != b) {
            a.erase(it);
        }
        it++;
    }
}

问题:对于46998以上的值,我得到了一个分段错误。任何等于或少于46998的东西都会像预期的那样工作。关于我做错了什么或者可以改进什么,我能得到一些帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-19 19:34:29

事实上,没有必要定义一个列表来计算素数之和。

不过,如果要使用您的方法,那么在语句之后的函数search

代码语言:javascript
复制
a.erase(it);

迭代器it变得无效。

你应该写

代码语言:javascript
复制
while (it != a.end()) {
    if (*it % b == 0 && *it != b) {
        it = a.erase(it);
    }
    else
    {  
        it++;
    }
}

或者你可以写

代码语言:javascript
复制
++it;
while (it != a.end()) {
    if (*it % b == 0) {
        it = a.erase(it);
    }
    else
    {  
        it++;
    }
}

注意这个,而不是这个for循环。

代码语言:javascript
复制
for (std::list<long long>::iterator it = nums.begin(); it != nums.end(); it++) {
    PrimesSum+=*it;
}

您可以使用标头std::accumulate中声明的标准算法<numeric>

代码语言:javascript
复制
PrimesSum = std::accumulate( nums.begin(), nums.end(), 0ll );

使用带有列表的方法,我将按照以下方式编写程序

代码语言:javascript
复制
#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>
#include <numeric>

int main()
{
    unsigned int range = 10'000;

    std::list<unsigned int> primes;

    for ( unsigned int i = 1; i++ < range; )
    {
        if ( std::find_if( std::begin( primes ), std::end( primes ),
             [&i] ( const auto &item ) { return  i % item  == 0; } ) ==
             std::end( primes ) )
        {
            primes.push_back( i );
        }            
    }

    auto sum = std::accumulate( std::begin( primes ), std::end( primes ), 0llu );

    std::cout << "There are " << primes.size() 
              << " prime numbers.\nTheir sum is " 
              << sum << '\n';
}

程序输出是

代码语言:javascript
复制
There are 1229 prime numbers.
Their sum is 5736396
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73042385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档