以下是计算阶乘
的函数事实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;
}
输入:1 88888
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
此代码如何运行te&lt; = 1000000000 ??
这是我的主要功能:
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);
}
}
}
此代码正在运行输入&lt; = 1024,建议编辑&gt; 1024 ...
答案 0 :(得分:2)
问题是,你有一个最大的递归深度。如果要避免这种情况,可以在不递归的情况下重写代码。这可以使用简单的循环来完成。它看起来像这样(这段代码完全未经测试):
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;
}