2010-05-06 175 views
0

我正在使用下面的代碼,但參數不傳遞給方法。biginteger計算問題

BigInteger p = BigInteger.valueOf(0); 
BigInteger u1 = obj.bigi_calc(g1, l); 

在這個g1中,l是long值。

的方法是

private BigInteger bigi_calc(long g1, long l){   

     BigInteger cal = BigInteger.valueOf(g1); 
     BigInteger cal1= BigInteger.valueOf(l); 
     for(BigInteger f = BigInteger.ONE;f.compareTo(cal1)>0;f=f.add(BigInteger.ONE)){ 
      //BigInteger p= BigInteger.valueOf(0); 
      p = cal.multiply(cal1); 
      System.out.println("check p"+p); 
     } 
    // System.out.println("check p"+p); 
     return p; 
    } 

的elipse表明,它可以是不同步的,但這些參數不會傳遞給函數。 你能幫我解決這個問題嗎?

+0

你到底想幹什麼?這段代碼沒有意義。 – polygenelubricants 2010-05-06 05:59:40

回答

1

您是否聲明BigInteger p = BigInteger.valueOf(0);作爲bigi_calc之外的局部變量?因爲在那種情況下,那麼p的範圍不會擴展到方法bigi_calc

您既可以想:

  • p作爲第三個參數
  • 使它成爲一個成員字段

做的第一選擇,你會做這樣的事情:

private BigInteger bigi_calc(long g1, long l, BigInteger p) { ... } 

//... 
BigInteger p = BigInteger.valueOf(0); 
BigInteger u1 = obj.bigi_calc(g1, l, p); 

檢查代碼進一步顯示它沒有任何意義。如果這是你正在計算的東西,那麼有一個BigInteger.pow。並且使用BigInteger作爲循環計數器時,它不會超過long只是不必要的混亂。

如果pow(long base, long exp)是你想要什麼,以及由於某種原因,你不能使用BigInteger.pow,那麼你可以寫這樣的:

static BigInteger pow(long base, long exp){    
    BigInteger result = BigInteger.ONE; 
    BigInteger biBase = BigInteger.valueOf(base); 
    for (long i = 0; i < exp; i++) { 
     result = result.multiply(biBase); 
    } 
    return result; 
} 
+1

另請參閱http://en.wikipedia.org/wiki/Exponentiation_by_squaring獲得更快的指數,但除非這是作業,否則應該使用'BigInteger.pow' – polygenelubricants 2010-05-06 06:13:34