我在我的计算机上编译并运行,并且它正确执行。我尝试了IDEONE,我得到了一个成功的答案。
但是当我在SPOJ中提交时,我得到了错误的答案。这个实现有问题吗?
#include <iostream>
#include <cstdio>
using namespace std;
int factorial(int n) {
if (n <= 1)
return 1;
return n * factorial(n - 1);
}
int main() {
int t;
int n;
cout << "";
cin >> t;
for (int i = 0; i < t; i++) {
cout << "";
cin >> n;
printf("%d\n", factorial(n));
}
return 0;
}
答案 0 :(得分:1)
上述代码的问题是由于我们可以用来存储int
的值的有限空间。在32位计算机上,int
具有32位(值0或1),这意味着unsigned int
可以具有的最大值为(2 ^ 31 - 1)并且int
可以具有的最大值是(2 ^ 30 - 1)(因为它需要一位来表示它是正还是负,而unsigned int
总是正的并且可以将该位用于只是常规价值)。
现在,除此之外,您应该研究如何将非常大的数值存储在不同的数据结构中!也许阵列会是一个不错的选择......
只是为了头脑风暴,想象一下创建int bigInteger[100]
(应该足够大以容纳100!)。要将两个数字相乘,您可以实现bitMultiplication(int bitNum[], int num)
函数,该函数将通过引用接收数组并执行按位乘法(有关详细信息,请参阅以下帖子:Multiplying using Bitwise Operators)。
在递归因子函数中使用bitMulitiplication(int bitNum[], int num)
代替常规乘法,你应该有一个适用于大n的函数!