0
我正在處理大量的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 < 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;
}
}
從哪裏開始? (這看起來像功課...所以我會給你一些想法)。 (a)BigInteger構造函數在每次使用中的第一個參數可以被簡化...保持噪聲最小化,這樣我們都可以專注於你想要做的事情。 (b)您將一個可能大到2^80的值(我認爲您希望超過2^70的值)轉換爲Java _int_ - 32位(2^32)值。還要注意,Java _long_仍然只有2^64,並且_int_和_long_都是無符號的。你有一些工作要做。 –
@Richard Sitze是的,在BigInteger的構造函數中,我認爲可以設置一個指定的範圍,但後來學會了我不能。我也將BigInteger轉換爲int,因爲該賦值特別要求函數接受整數,這對我來說確實會更難......但是,儘管如此,感謝您的幫助。 – Jasmine
'n = new BigInteger((80-70)+ 70,r); int num1 = n.intValue();'產生一個0到2^80-1之間的隨機數,然後丟棄高階48位,得到一個介於-2^31和2^31-1之間的值。你確定這就是你想要做的?爲什麼還要生成一個80位隨機數然後截斷它呢? –