Найти сумму простых чисел между двумя x1, x2, не можете найти ошибку? - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно найти сумму простых чисел между двумя числами, скажем, x1 и x2 включительно, однако я не могу определить, что не так? например, если я введу 3 и 9, я получу 15, но я получу 133!

#include <iostream>
using namespace std;
int prime(int n1, int n2)
{
    int  count =0;
    bool prime = true;

    for (n1; n1 < n2; n1++)
    {
        for (int i = 2; i < n1; i++)
        {
            if (n1 % i == 0) {
                prime = false;
                continue;
            }
            else
                count++;
        }
    }
    return count;

}
int main()
{
    int n1, n2;
    cout << " Enter values for n1 and n2 (n1 must be smaller than n2):   ";
    cin >> n1>>n2;


    cout << " Sum of prime numbers from " << n1 << " and till " << n2 << " inclusively : " << prime(n1, n2) << endl;
    system("pause");
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Я большой сторонник одного цикла для каждой функции. Это очень хороший пример для этого. Ваш внутренний цикл проверяет, является ли число простым, поэтому на самом деле оно должно быть функцией само по себе:

bool is_prime(int n);

int sum_primes_between(int n1, int n2)
{
    int sum = 0;

    for (; n1 <= n2; n1++)
    {
        if (is_prime(n1))
            sum += n1;
    }
    return count;
}

Теперь не только легче читать, но и лучше тестировать отдельные части кода. Вы можете проверить правильность is_prime и после этого проверить правильность num_primes_between. Если бы вы пошли по этому маршруту с самого начала, у вас даже не было бы ошибки, с которой вы сейчас столкнулись, обнаружив, что число простое.


А вот еще более аккуратное решение с range-v3 :

using namespace ranges;

bool is_prime(int n);

int sum_primes_between(int n1, int n2)
{
    return accumulate(view::ints(n1, n2 + 1) | view::filter(is_prime), 0);
}
0 голосов
/ 08 ноября 2018

Ни один из предоставленных ответов пока не соответствует требованию инклюзивности. Вот исправленная версия, включающая оптимизированный алгоритм проверки на простоту:

#include <iostream>
#include <cmath>

using namespace std;

bool is_prime(int n) {
    // handle special cases
    if (n <= 1) {
        return false;
    }
    if (n <= 3) {
        return true;
    }
    if (n % 2 == 0 || n % 3 == 0) {
        return false;
    }
    /* because we covered multiples of 2 and 3 we can reduce the number of checks
    drastically */
    for(int i = 5, r = sqrt(n); i =< r; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) {
            return false;
        }
    } 
    return true;
}
int sum_of_primes(int n1, int n2) {
    int sum = 0;
    // loop from n1 up to n2
    for ( ;n1 <= n2; n1++) {
        if (is_prime(n1)) {
            sum += n1;
        }
    }
    return sum;
}
int main() {
    cout<<"The sum of primes between 2 and 15 is: "<<sum_of_primes(2,15)<<endl;
    return 0;
}

Ваш исходный код не вычислял сумму простых чисел, вы просто увеличивали переменную count на каждой итерации, которая не находила делитель текущего числа, которое вы проверяли.

0 голосов
/ 08 ноября 2018

Ваша основная функция не подходит. Это должно быть похоже.

int prime(int n1, int n2) {
    int sum = 0;

    for (n1; n1 < n2; n1++) {       
        bool prime = true;
        for (int i = 2; i < n1; i++) {
            if (n1 % i == 0) {
                prime = false;
                break;
            }
        }
        if( prime ) { // current n1 is prime 
            sum = sum + n1;
        }
    }
    return sum;
}

Вы ничего не добавляете, если ваш n1 прост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...