由于Java内置Biginteger,但是却没有开方的接口,不得不自己动手写,在网上学习了,先根据被开方数位数确定开方后数的位数,在自高位枚举逼近待开方数,最后求得开方结果。
public static BigInteger sqrt(String x) {
int mlen = x.length(); //被开方数的长度
int len; //开方后的长度
BigInteger beSqrtNum = new BigInteger(x);//被开方数
BigInteger sqrtOfNum; //存储开方后的数
BigInteger sqrtOfNumMul; //开方数的平方
String sString;//存储sArray转化后的字符串
if(mlen%2 == 0) len = mlen/2;
else len = mlen/2+1;
char[] sArray = new char[len];
Arrays.fill(sArray, '0');//开方数初始化为0
for(int pos=0; pos<len; pos++){
//从最高开始遍历数组,每一位都转化为开方数平方后刚好不大于被开方数的程度
for(char num='1'; num<='9'; num++){
sArray[pos] = num;
sString = String.valueOf(sArray);
sqrtOfNum = new BigInteger(sString);
sqrtOfNumMul = sqrtOfNum.multiply(sqrtOfNum);
if(sqrtOfNumMul.compareTo(beSqrtNum) == 1){
sArray[pos]-=1;
break;
}
}
}
return new BigInteger(String.valueOf(sArray));
}
这个接口需求的是一个String类参数,当然也可以通过简单的变动变为Biginteger。