Java 带有大整数的堆栈溢出
我正在处理大量的大整数和递归,这会导致堆栈溢出。我有没有办法解决这个问题,或者我做错了什么导致堆栈溢出Java 带有大整数的堆栈溢出,java,recursion,biginteger,Java,Recursion,Biginteger,我正在处理大量的大整数和递归,这会导致堆栈溢出。我有没有办法解决这个问题,或者我做错了什么导致堆栈溢出 import java.math.BigInteger; import java.util.Random; public class Recur { public static void main(String[] args) { BigInteger n, m; Random r = new Random(); for (int i = 0; i <
import java.math.BigInteger;
import java.util.Random;
public class Recur {
public static void main(String[] args) {
BigInteger n, m;
Random r = new Random();
for (int i = 0; i < 500; i++) {
n = new BigInteger((80 - 70) + 70, r);
int num1 = n.intValue();
m = new BigInteger((80 - 70) + 70, r);
int num2 = m.intValue();
System.out.println("N: " + n + " " + "M: " + m);
System.out.println("Recursive GCD: " + recursiveGCD(num1, num2));
System.out.println("Iterative GCD: " + iterativeGCD(num1, num2));
}
}
public static int recursiveGCD(int n, int m) {
if (n == 0)
return m;
else if (m == 0)
return n;
else if (n > m)
return recursiveGCD(n % m, m);
else if (m < n)
return recursiveGCD(n, m % n);
else
return n;
}
public static int iterativeGCD(int n, int m) {
while (n != 0 && m != 0) {
if (n > m)
n = n % m ;
else if (m > n)
m = m % n;
else
return n;
}
if (n == 0)
return m;
else
return n;
}
}
import java.math.biginger;
导入java.util.Random;
公共类重现{
公共静态void main(字符串[]args){
大整数n,m;
随机r=新随机();
对于(int i=0;i<500;i++){
n=新的大整数((80-70)+70,r);
int num1=n.intValue();
m=新的大整数((80-70)+70,r);
int num2=m.intValue();
System.out.println(“N:+N++++”M:+M);
System.out.println(“递归GCD:+recursiveGCD(num1,num2));
System.out.println(“迭代GCD:+iterativeGCD(num1,num2));
}
}
公共静态int递归gcd(int n,int m){
如果(n==0)
返回m;
else如果(m==0)
返回n;
否则,如果(n>m)
返回递归GCD(n%m,m);
else if(mm)
n=n%m;
如果(m>n),则为else
m=m%n;
其他的
返回n;
}
如果(n==0)
返回m;
其他的
返回n;
}
}
由于操作系统中的堆栈设计用于为每个正在运行的程序存储有限数量的内存地址,因此会出现堆栈溢出
也可能BigInt有一个特殊的影响,但我认为你可以通过做一个线性规划来消除这个错误 从哪里开始?(这看起来像是家庭作业……所以我要给你一些东西来思考)。(a) 每次使用BigInteger构造函数的第一个参数都可以简化。。。把噪音控制在最低限度,这样我们就可以专注于你想做的事情。(b) 您正在将一个可能高达2^80的值(我认为您希望的是超过2^70的值)转换为Java int—一个32位(2^32)的值。还要注意,Java long仍然只有2^64,int和long都是无符号的。“你有一些事情要做。@Richard Sitze是的,在BigInteger构造函数中,我认为可以设置一个指定的范围,但后来发现我不能。我还将BigInteger转换为int,因为赋值特别要求函数接受int,这让我很难接受。。。尽管如此,还是要感谢您的帮助。
n=newbiginger((80-70)+70,r);int num1=n.intValue()
生成一个介于0和2^80-1之间的随机数,然后丢弃高阶48位,得到一个介于-2^31和2^31-1之间的值。你确定这就是你想做的吗?为什么要费心生成一个80位随机数,然后截断它呢?如果你想找出你的堆栈溢出异常,我强烈建议你在IDE调试器中一次一行地遍历代码。仔细看看BigInteger.intValue的javadoc。不,在实现中有一个非常真实的错误导致堆栈溢出。