2016-10-29 137 views
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; 


    } 

} 
+0

從哪裏開始? (這看起來像功課...所以我會給你一些想法)。 (a)BigInteger構造函數在每次使用中的第一個參數可以被簡化...保持噪聲最小化,這樣我們都可以專注於你想要做的事情。 (b)您將一個可能大到2^80的值(我認爲您希望超過2^70的值)轉換爲Java _int_ - 32位(2^32)值。還要注意,Java _long_仍然只有2^64,並且_int_和_long_都是無符號的。你有一些工作要做。 –

+0

@Richard Sitze是的,在BigInteger的構造函數中,我認爲可以設置一個指定的範圍,但後來學會了我不能。我也將BigInteger轉換爲int,因爲該賦值特別要求函數接受整數,這對我來說確實會更難......但是,儘管如此,感謝您的幫助。 – Jasmine

+0

'n = new BigInteger((80-70)+ 70,r); int num1 = n.intValue();'產生一個0到2^80-1之間的隨機數,然後丟棄高階48位,得到一個介於-2^31和2^31-1之間的值。你確定這就是你想要做的?爲什麼還要生成一個80位隨機數然後截斷它呢? –

回答

-1

您正在獲取堆棧溢出,因爲您的操作系統中的堆棧旨在爲每個正在運行的程序存儲有限的內存地址。

也可能BigInt有一個特殊的影響,但我認爲你可以通過製作一個線性程序來擺脫那個錯誤。

+0

不,在執行過程中存在一個非常真實的錯誤,導致堆棧溢出。 –