Программа отказывается работать при вводе большого числа
Моя программа ищет простые числа в диапазоне [2; n]. При вводе n < 65538 программа выполняет свою задачу за 4,5 секунды. Но при n >= 65538 моя программа отказывается работать и завершается с кодом -1073741819. (Я заметил, что число 65538 близко к 2^16 (= 65536). Но, я думаю, это просто совпадение). Вот мой код:
#include <iostream>
#include <chrono>
using namespace std;
// Вывод всех простых чисел до n решетом Сундарама.
int main()
{
setlocale(LC_ALL, "Russian");
int n;
cout << "Введите число n:" << endl;
cin >> n;
int k = (n - 2) / 2 + 1;
bool* nums = new bool[k];
for (int i = 0; i < k; i++) nums[i] = true;
auto start = chrono::high_resolution_clock::now();
for (int i = 1; i < k; i++)
{
int j = i;
while (i + j + 2 * i * j < k)
{
nums[i + j + 2 * i * j] = false;
j++;
}
}
if (k > 2)
cout << 2 << endl;
for (int i = 1; i < k; i++)
{
if (nums[i])
{
cout << 2 * i + 1 << endl;
}
}
auto end = chrono::high_resolution_clock::now();
chrono::duration<float> duration = end - start;
cout << "Длительность выполнения алгоритма: " << duration.count() << " секунд." << endl;
delete[]nums;
nums = NULL;
system("pause>0");
}
Памяти может не хватило? Или в чём беда?
Ответы (1 шт):
Предельные значения переменной типа int равны -2147483648 .. +2147483647 . Превышение можно достичь при индексах 32768. Неопределённое поведение обычно приводит к отрицательным результатам.
32768 + 32768 + 2 * 32768 * 32768 = 2147549184 = -2147418112
что приводит к крушении программы при попытке модифицирования не своей памяти. Помогает использования типа побольше размера вроде uint64_t