Я хочу найти трехзначное число, сумма факториалов его цифр совпадает с этим числом.
В чем проблема в моих кодах, так как ничего не показывает.
Функция теста дает каждую цифру, а функция факта вычисляет факториал.
#include <iostream>
using namespace std;
int fact(int y);
int test(int x);
int main()
{
for (size_t i = 100; i < 1000; i++)
{
int sum = 0;
int x = i;
while (x > 0)
{
sum += test(x);
x /= 10;
}
if (sum == i)
{
cout << i << endl;
}
}
return 0;
}
int fact(int y)
{
if (y == 1)
{
return 1;
}
else
return y * fact(y - 1);
}
int test(int x)
{
int r;
r = x % 10;
return fact(r);
}
Этот удобный небольшой инструмент: godbolt.org/z/YxPYeEzb6 должен дать довольно четкий намек на то, что пошло не так. Отладчик поможет вам лучше понять это и приведет к решению.
Дополнительное примечание: проверьте диагностический вывод. Ваша программа может завершаться с кодом ошибки, который в значительной степени говорит вам, что произошло, если вы посмотрите код ошибки.
Есть небольшая проблема, заключающаяся в том, что int не гарантирует, что сможет представлять факториалы 8 или 9 (и существуют реальные реализации, которые поддерживают 16-битный int, но не могут). Чтобы иметь такую гарантию, используйте вместо этого long.
Мое правило: максимальная глубина рекурсии для рекурсивной функции должна быть O(log n). Такая реализация с глубиной O(n) вызывает проблемы: она быстро выйдет из строя с (не очень) большим n. И этот тип рекурсивной функции можно очень легко преобразовать в цикл, который легче понять, легче отлаживать, безопаснее и быстрее.





Ваша функция int fact(int y) неверна. Вы забыли случай y = 0.
int fact(int y) {
if (y <= 1) {
return 1;
}
else return y * fact(y - 1);
}
Кроме того, вам нужно вычислить факториал цифр, чтобы вы могли его кэшировать.
Похоже, это очень хорошее время, чтобы научиться [отлаживать] (как отлаживать небольшие программы | Сказочные приключения в программировании) ваших программ. Как, например, использование отладчика для пошагового выполнения кода построчно, отслеживая переменные и их значения. Это должно облегчить понимание того, когда что-то пойдет не так.