#include <stdio.h>
int findnumb(int max)
{
static int total=2;
static int desk=1;
if(total>max)
{
return 0;
}
else
{
if(desk>=total)
{
total++;
desk=1;
return findnumb(max);
}
else
{
desk++;
int left=desk*(desk-1)/2;
int right=(total*(total+1)/2)-(desk*(desk+1)/2);
if(left==right)
{
printf("Desk number %d, number of participants %d\n", desk, total);
return findnumb(max);
}
return findnumb(max);
}
}
}
main()
{
int max;
printf("Enter the upper bound:\n");
scanf(" %d", &max);
printf("------------------------\n");
findnumb(max);
printf("Search is complete");
}
Это для загадке, как это:Программа сбой и возвращает код 255
Предположим, что существует совещание, и мы не знаем, сколько людей посещают его. Однако мы видим, как человек уходит с заседания. Если мы спросим человека, сколько людей существует на собрании, он просто отвечает «Я не знаю». Тем не менее он говорит: «Я сидел на стуле с номером х, и суммирование чисел ниже и выше меня равно. Другими словами, если число стула равно x, то 1,2,3 ... .x-1 = x + 1 x + 2 ... ... t-1, t (общее количество участников). Кроме того, мы не знаем значения t и номера стула x. Итогом участника 8, а номер стула 6 является примерной конфигурацией. Потому что 1 + 2 + 3 + 4 + 5 = 7 + 8 = 15. Ваша задача - найти похожие конфигурации по одной попытке.
И он хочет, чтобы решение реализовало рекурсивную функцию.
Так что, когда я запускаю этот код, он не может управлять значением scanf'е больше 360 при сбое и завершении с кодом возврата 255, так как я могу исправить эту проблему?
Возможно, это переполнение стека ... –
Конечно, переполнение стека число рекурсивных вызовов равно O (n^2) -> для 360 -> так как 360^2 = 129600 рекурсивный вызов в стеке :) –
Поздравляем, вы нашли основную цель рекурсии вне теории алгоритмов: сжигание всей доступной ОЗУ и создание переполнения стека. В качестве бонуса ваша программа также работает намного медленнее, чем в противном случае, и гораздо менее удобочитаема. – Lundin