题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1211
求一个正整数的平方根,输出其平方根的整数部分,正整数位数len<1000;
因为一个数的平方根的位数是在 len/2 - 1 ~ len / 2 + 1 之间,利用二分法可求得此数的平方根。
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BigInteger[] bite = new BigInteger[1005];
bite[0] = BigInteger.ONE;
bite[1] = BigInteger.valueOf(4); // sqrt(10) < 4 , sqrt(100) < 40 ,.....
for(int i = 2; i < 1005; i++)
{
bite[i] = bite[i-1].multiply(BigInteger.TEN);
}
while (sc.hasNext()) {
BigInteger bi = sc.nextBigInteger();
BigInteger first = bite[bi.toString().length()/2 - 1 < 0 ? 0 : bi.toString().length()/2 - 1] ;
BigInteger second = bite[bi.toString().length()/2 + 1];
BigInteger factor1 = second;
BigInteger factor;
while (true) {
factor = second.add(first).divide(BigInteger.valueOf(2));
if(factor1.equals(factor) ) break;
if(factor.multiply(factor).compareTo(bi) < 0){
first = factor;
}else if(factor.multiply(factor).compareTo(bi) > 0){
second = factor;
}
factor1 = factor;
}
System.out.println(factor);
}
}
}