Выдаешь ошибку "Необработанное исключение по адресу" c++
При работе программы выдает ошибку. "Необработанное исключение по адресу 0x003A2759 в ConsoleApplication2.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x00862FF0)." Но ошибка вылезает не всегда, это сильно вводит в заблуждение и в итоге не понятно как решить проблему.
using namespace std;
#include <iostream>
#include <random>
#include <ctime>
int fibonacci(int n)
{
if (n < 1)
{
return 0;
}
if (n == 1)
{
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
int fibonacci_iteration(int n)
{
int a = 0;
int b = 1;
for (int i = 0; i < n; i++)
{
a = a + b;
b = a - b;
}
return a;
}
bool prime(long long n)
{
for (long long index = 2; index < n; index++)
{
if (n % index == 0)
{
return false;
}
}
return true;
}
bool func_value_equality(long long func, int n)
{
if (func == n)
{
return true;
}
return false;
}
bool func_square_value_equality(long long func, int n)
{
if (func == n * n)
{
return true;
}
return false;
}
void fill_array(long long arr[], int i, long long n)
{
arr[i] = n;
}
void print_array(long long arr[], int size)
{
for (int i = 0; i < size; i++)
{
cout << " " << arr[i] << " ";
}
}
unsigned long gcd_Euclid(long long a, long long b)
{
while (a != b)
{
if (a > b)
{
long tmp = a;
a = b;
b = tmp;
}
b = b - a;
}
return a;
}
int main()
{
random_device rd;
mt19937 rndm(rd());
setlocale(LC_ALL, "Russian");
long long i, year, month, mounth;
int count_equality = 0, count_square_equality = 0, count_prime = 0;
cout << "Введите кол-во месяцев: ";
cin >> i;
cout << endl;
for (month = 1; month <= i; ++month)
{
long long value = fibonacci(month);
double fibonacci_division = (double(fibonacci(month + 1)) / double(fibonacci(month)));
year = month / 12;
mounth = month % 12;
cout << "Прошел " << year << " лет и " << mounth << " месяцев" << endl;
cout << "Количество пар кроликов: " << value << endl;
cout << "Значение F(n+1)/F(n): " << fibonacci_division << endl;
cout << "Приближенное значение номера числа Фибоначчи: " << month << endl;
if (func_value_equality(value, month))
{
cout << "F(N) = N" << endl;
count_equality += 1;
}
if (func_square_value_equality(value, month))
{
cout << "F(N) = N*N" << endl;
count_square_equality += 1;
}
if (prime(value))
{
cout << "F(N) - Простое" << endl;
count_prime += 1;
}
cout << endl;
cout << endl;
}
long long* arr_equality = new long long[count_equality];
long long* arr_square_equality = new long long[count_square_equality];
long long* arr_prime = new long long[count_prime];
int index1 = 0, index2 = 0, index3 = 0;
for (month = 1; month <= i; ++month)
{
long long value = fibonacci(month);
if (func_value_equality(value, month))
{
fill_array(arr_equality, index1, value);
index1 += 1;
}
if (func_square_value_equality(value, month))
{
fill_array(arr_square_equality, index2, value);
index2++;
}
if (prime(value))
{
fill_array(arr_prime, index3, value);
index3++;
}
}
cout << "Элементы, где F(N)=N " << endl;
print_array(arr_equality, count_equality);
cout << endl;
cout << "Элементы, где F(N)=N*N " << endl;
print_array(arr_square_equality, count_square_equality);
cout << endl;
cout << "Элементы, где F(N) - Простое " << endl;
print_array(arr_prime, count_prime);
cout << endl;
cout << endl;
int m, nod1, nod2;
m = ((int(rndm()) % i)+1);
nod1 = lcd_Euclid(fibonacci(i), fibonacci(m));
nod2 = lcd_Euclid(i, m);
cout << "Сгенерировалось число m = " << m << " n = " << i << endl;
if (nod1 == nod2)
{
cout << "Показать, что НОД (Fn, Fm) = НОД (n,m) " << nod1 << " = " << nod2 << endl;
}
else
{
cout << "Показать, что НОД (Fn, Fm) != НОД (n,m)" << nod1 << " = " << nod2 << endl;
}
delete[] arr_equality;
delete[] arr_square_equality;
delete[] arr_prime;
cout << endl;
cout << endl;
cout << "runtime = " << clock() / 1000.0 << endl;
}
Ответы (1 шт):
У вас очень глубокая рекурсия в lcd_Euclid(). Почему бы вам не воспользоваться для поиска НОД - наибольшего общего делителя - функцией gcd из стандартной библиотеки?
Если же по условию надо писать ее самому - то попробуйте, например, так:
long long gcd(long long m, long long n)
{
while(m && n) if (m < n) n %= m; else m %= n;
return (m == 0L) ? n : m;
}
И еще - такая рекурсия, как у вас для чисел Фибоначчи - это тоже ужас. Но не глубокий, а широкий. И при больших значениях будет конкретно тормозить программу. Воспользуйтесь итеративным вариантом.