2016-09-14 68 views
1

我一直在研究一個問題,我需要BigInteger的平方根以便複製其他人的方法,因爲Java沒有內置方法(不是我所知道的)並且工作正常。這個平方根法for循環的作用是什麼?

這裏是方法:

public static BigInteger bigIntSqRootFloor(BigInteger x) 
    throws IllegalArgumentException {   
    if (x.compareTo(BigInteger.ZERO) < 0) { 
     throw new IllegalArgumentException("Negative argument."); 
    } 

    if (x .equals(BigInteger.ZERO) || x.equals(BigInteger.ONE)) { 
     return x; 
    } 

    BigInteger two = BigInteger.valueOf(2L); 
    BigInteger y; 

    for(y = x.divide(two); y.compareTo(x.divide(y)) > 0; y = ((x.divide(y)).add(y)).divide(two)); 
    return y; 
} 

不過,我認爲for循環是方法的最進口一部分,但我從來沒有見過一個與半結束冒號,我不知道它是如何工作的。有人能向我解釋它在這種方法中的作用是什麼?

+1

這意味着所有的代碼是在冷杉說法並沒有什麼在循環做。 JIT沒有將x .divide(y)作爲常量優化,所以它的問題應該寫成更傳統的循環。 –

+0

如果您想知道循環實際做了什麼,它會使用[巴比倫方法](https://en.wikipedia.org/wiki/Methods_of_computing_square_roots)通過重複逼近計算平方根。 – dasblinkenlight

回答

2

這是一個空循環 - 即所有邏輯都在for語句中執行,並且它沒有主體。

for(y = x.divide(two); y.compareTo(x.divide(y)) > 0; y = ((x.divide(y)).add(y)).divide(two)); 

等同於:

for(y = x.divide(two); y.compareTo(x.divide(y)) > 0;) { 
    y = ((x.divide(y)).add(y)).divide(two); 
} 

或郵寄至:

y = x.divide(two); 
while (y.compareTo(x.divide(y)) > 0) { 
    y = ((x.divide(y)).add(y)).divide(two); 
} 
相關問題