Процесс вернул -1073741819 (0xC0000005) (почему, хотя ??) - PullRequest
0 голосов
/ 25 марта 2019

Итак, я решал домашнее задание, и я выполнил этот фрагмент кода, который должен найти наибольшую разницу между двумя простыми числами в интервале [a, b], и я получил «Возвращенный процесс -1073741819 (0xC0000005) «

#include <iostream>
#include <vector>
#include <bitset>

using namespace std;
bitset <10000000>v;
int main()
{
    for (int i = 2; i < 10000000; i++)
    {
        if (v[i] == 0)
        {
            for (int j = i * i; j < 10000000; j += i)
                v[j] = 1;
        }
    }
    int n, a, b, maxi = 0, mini = 0, smax = 0;
    cin >> a >> b;
    int poz = a;
    while (v[poz] == 1)
        poz++;
    int prev = poz;
    poz++;
    while (v[poz] == 1 && poz < b)
        poz++;
    if (poz == b && v[b] == 1)
    {
        cout << -1; return 0;
    }
    int next = poz;
    poz++;
    while (poz <= b)
    {
        if (next - prev > smax)
        {
            smax = next - prev;
            maxi = next;
            mini = prev;
        }
        if (v[poz] == 0)
        {
            prev = next;
            next = poz;
        }
        poz++;
    }
    cout << mini << " " << maxi;
    return 0;
} 

я ожидал 43 с 47

Ответы [ 3 ]

3 голосов
/ 25 марта 2019

В вашем цикле инициализации, когда i равно 46349, i*i равно 2,148,229,801, это больше, чем вписывается в 32-разрядное целое число со знаком, поэтому оценивается как -2,146,737,495.v[j] затем вызывает сбой.

Вы должны либо изменить свой код, чтобы использовать больший тип данных, либо установить ограничение для i на sqrt(10000000) вместо 10000000.

2 голосов
/ 25 марта 2019

Я предполагаю, что i*i переполняется, когда i велико, приводя к отрицательному значению для j и нарушению доступа при v[j]=1;.

0 голосов
/ 25 марта 2019

У вас есть потенциальная ошибка сегментации в строке v[j]=1;, где j может превышать 10000000.

Пожалуйста, проверьте свои границы.

...