- 已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。
这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
5天前关闭。
Improve this question
我在编写强数问题的代码,当我运行它的时候,我通过了3个案例,但是当我运行第4个案例的时候,什么也没有发生。
我通过了:1,2,145但是40585。
下面是我的代码:
#include <iostream>
using namespace std;
int Get(int n);
int Factorial(int n, int sum);
int main()
{
system("cls");
int n;
cout << "Enter. \n";
cin >> n;
if (n == Get(n))
{
cout << "True. \n";
}
else
{
cout << "False. \n";
}
return 0;
}
int Get(int n)
{
static int sum = 0;
if (n / 10)
{
Get (n / 10);
}
return sum += Factorial(n % 10, 1);
}
int Factorial(int n, int sum)
{
if (n == 1)
{
return sum;
}
else
{
return Factorial(n - 1, sum *= n);
}
}
我不知道为什么,所以请帮帮我!
1条答案
按热度按时间hrirmatl1#
问题是,在这一行:
你用
n % 10
调用Factorial
,n % 10
可以是0
。Factorial
不能很好地处理这一点(对于n
,它将无限递归)。您可以通过将
Factorial
中的递归停止条件更改为以下内容来解决此问题:旁注:
如果你可以用迭代(即循环)代替递归来实现一个函数--这通常是推荐的。这是因为递归使用的堆栈通常相对较小。
在计算阶乘时,你必须科普
int
溢出非常快的额外问题- 13!已经太大了,无法存储在32位整数中。你可以通过使用64位整数或一些大数值库来处理它。然而,在这个特定的例子中,由于
Factorial
是针对最大值9计算的,所以这两个问题都可以(尽管我仍然更喜欢使用一个简单的阶乘循环)。正如@lastchance所评论的,您还可以将所有必需的10个值(对于0!.. 9!)保存在预先计算好的数组中。