欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

不使用已有函数求出一个数的平方根

程序员文章站 2024-01-22 13:59:58
...

      前一段时间领导出了一道算法题(找出一个数的平方根,精确到小数点后两位,不使用函数库),对此一直耿耿于怀,始终觉得自己的答案是有问题的,但是暂时没有想到其他好的办法。

      我是先求出最接近这个数的一个能够整除的平方根,比如说1的平方根是1,2的最接近的平方根也是1,3的最接*方根也是1,而5的最接近的平方跟是2,那么以2为基数,每次叠加0.01,加入说root是平方根,那么找出root 乘以root,然后乘积比该数大0.001的数。具体算法见以下代码:

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 找出一个数的平方根,精确到小数点后两位,不使用函数库.
 * 
 * @author qinge
 *
 */
public class Square {

	public static void main(String[] args) {
		for (int num = 1; num <= 1000; num++) {
			System.out.print(num + "的函数平方根:" + Math.sqrt(num));
			double root = findSmallRoot(num);
			System.out.print(" 小数点前一位是:" + root);
			while (true) {
				double product = root * root;
				if (product == num) {
					System.out.print(" 计算得出平方根是:" + root + "\n");
					break;
				} else if (product > num) {// 此处算法有遗漏
					if (product - num > 0.001) {
						System.out.print(" 计算得出平方根是:" + root + "\n");
						break;
					}
				}

				// 用加0.01进行控制
				root = root + 0.01;
				// 对double类型进行精度控制
				root = BigDecimal.valueOf(root).setScale(2, RoundingMode.HALF_UP).doubleValue();
			}
		}
	}

	/**
	 * 找出num的平方根的小数点前面的数字
	 * 
	 * @param num
	 * @return
	 */
	public static int findSmallRoot(int num) {
		// 遍历平方根的基数,基数的乘机必然会小于等于num
		for (int i = 1; i <= num && i * i <= num; i++) {
			// 找出基数则返回
			if (i * i == num) {
				return i;
			}
		}
		// 找num-1
		return findSmallRoot(num - 1);
	}
}

 相信一些大牛们一定有自己更神奇的算法,那么就贴出来吧!学习膜拜中...