“线程中的异常”;“主要”;递归中的java.lang.StackOverflower错误
这里是计算阶乘的函数事实“线程中的异常”;“主要”;递归中的java.lang.StackOverflower错误,java,function,exception,recursion,biginteger,Java,Function,Exception,Recursion,Biginteger,这里是计算阶乘的函数事实 static BigInteger fact(BigInteger n) { BigInteger f=BigInteger.ONE; BigInteger temp; if(n.compareTo(BigInteger.ONE) <= 0) return f; f=f.multiply(n).multiply(fact(n.subtract(BigInteger.ONE))); return f; } 这
static BigInteger fact(BigInteger n)
{
BigInteger f=BigInteger.ONE;
BigInteger temp;
if(n.compareTo(BigInteger.ONE) <= 0)
return f;
f=f.multiply(n).multiply(fact(n.subtract(BigInteger.ONE)));
return f;
}
这段代码如何为te运行问题是,您有一个最大的递归深度。如果您想避免这种情况,可以重写代码而无需递归。这可以使用一个简单的循环来完成。它看起来像这样(此代码完全未经测试):
问题是,你有一个最大的递归深度。如果您想避免这种情况,可以重写代码而无需递归。这可以使用一个简单的循环来完成。它看起来像这样(此代码完全未经测试):
检查此>>检查此>>无法完全测试,因为
n
引用了一个不可变的biginger
对象,所以n.subtract()
不做任何事情;除非你给某物赋值。你的意思是“完全未经测试”?对于输入大于10000的任何其他优化解决方案,都需要花费大量时间。我看不到任何直接和简单的方法来优化这段代码(但我自己不是一个大的优化器)。计算一个数的阶乘有很多不同的方法。也许这可以帮助你们。实际上问题不仅仅是计算阶乘,实际问题是计算阶乘中零作为后缀的数量@Leon同样,如果这个答案帮助或解决了你的StackOverflower问题(看起来是这样的),请接受它。不能完全测试,因为n
引用了一个不可变的BigInteger
对象,所以n.subtract()
什么都不做;除非你给某物赋值。你的意思是“完全未经测试”?对于输入大于10000的任何其他优化解决方案,都需要花费大量时间。我看不到任何直接和简单的方法来优化这段代码(但我自己不是一个大的优化器)。计算一个数的阶乘有很多不同的方法。也许这可以帮助你们。实际上问题不仅仅是计算阶乘,实际问题是计算阶乘中零作为后缀的数量@Leon同样,如果这个答案帮助或解决了您的StackOverflowerError
问题(看起来是这样的),请接受它。
Output:
Exception in thread "main" java.lang.StackOverflowError
at java.math.BigInteger.multiplyByInt(BigInteger.java:1523)
at java.math.BigInteger.multiply(BigInteger.java:1490)
at codechef.fact(codechef.java:30)
at codechef.fact(codechef.java:30)..... about 100 times
class codechef
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int t=sc.nextInt();
for(int i=0;i<t;i++)
{
int count=0; String te=sc.next();
BigInteger n=new BigInteger(te);
te=fact(n).toString();
for(int j=te.length()-1;j>=0;j--)
{
if(te.charAt(j) == '0')
{ count++; }
else break;
}
System.out.println(count);
}
}
}
static BigInteger fact(BigInteger n){
BigInteger f = BigInteger.ONE;
while(n.compareTo(BigInteger.ONE) > 0) {
f = f.multiply(n);
n = n.subtract(BigInteger.ONE);
}
return f;
}