输入int类型整数t,求t的平方根,返回类型为double。
思路:
先确定当前数所处的最小整数区间, (如果开方之后还是整数值,那就直接返回)
然后再通过二分法来进行判断检测 (确定一个精确值,当二分相差小于精确值,则返回当前二分区间中间值)
思考:有必要先找出最小整数区间吗?
当然有必要。
如果给的数刚好开方后是整数类型,直接用二分法是没办法获取精确的整数的。
package com.xxxx;
/**
* create by ziqiiii
*/
public class Example {
static public void main(String[] args) {
for (int i = 0; i <= 10; i++) {
System.out.println(i + " : " + Math.sqrt(i));
System.out.println(i + " : " + sqrt(i, null));
}
}
public static double sqrt(int t, Double precise) {
if (t < 0) {
throw new RuntimeException("Negative number cannot have a sqrt root.");
}
//先确定当前数所处的最小整数区间
int i = 0;
for ( ; i <= t; i++) {
if (i * i == t) {
return i;
}
if(i * i > t){
break;
}
}
//再通过二分法来进行判断检测
double low = i-1, high = i, prec = precise != null ? precise : 1e-7;
double middle, squre;
while (high - low > prec) {
middle = (low + high) / 2;
squre = middle * middle;
if (squre > t) {
high = middle;
} else {
low = middle;
}
}
return (low + high) / 2;
}
}
参考:
java不使用Math.sqrt方法实现的求平方根