利用逼近的思路直接二分开方找出值
1 package lanqiao; 2 3 import java.math.BigInteger; 4 import java.util.Scanner; 5 public class Main { 6 7 static BigInteger cal(BigInteger x){ 8 BigInteger l = BigInteger.ONE ; 9 BigInteger r = x ; 10 BigInteger temp = BigInteger.ZERO ; 11 while(!l.equals(r)){ 12 BigInteger mid = (l.add(r)).divide(BigInteger.valueOf(2)) ; 13 if(temp.compareTo(BigInteger.ZERO)!=0&&temp.compareTo(mid)==0){ 14 break ; 15 }else{ 16 temp = mid ; 17 } 18 if(temp.compareTo(BigInteger.ZERO)==0){ 19 temp = mid ; 20 } 21 if(mid.multiply(mid).compareTo(x)==1){ 22 r=mid ; 23 }else{ 24 l=mid ; 25 } 26 } 27 if(l.multiply(l).compareTo(x)==1){ 28 l=l.subtract(BigInteger.ONE) ; 29 } 30 return l; 31 32 } 33 public static void main(String[] args) { 34 // TODO Auto-generated method stub 35 Scanner in = new Scanner(System.in) ; 36 37 while(in.hasNextBigInteger()){ 38 BigInteger n = in.nextBigInteger() ; 39 40 41 BigInteger x = cal(n) ; 42 System.out.println(x); 43 44 } 45 } 46 47 }