黑马程序员技术交流社区

标题: java 求某值得算术平方根 [打印本页]

作者: 随便    时间: 2013-4-2 12:36
标题: java 求某值得算术平方根
本帖最后由 邓宫财 于 2013-4-3 16:41 编辑

例如:double b = 4; √b的值计算出来时2.
用java语言,帮忙解决一下。
不能使用java.lang.Math.sqrt()方法。
查看方法内部源代码

  1. public static native double sqrt(double a);
复制代码
所以没有提供什么解决方案而是使用本地解决,所以不知道怎么处理的.
希望也给不知道的同学考虑考虑


作者: 随便    时间: 2013-4-2 13:08
我有一种方案,就是使用牛顿迭代法。

用(x,f(x))的切线来逼近方程x^2-a=0的根。
例如:求3的平方根。可以随机指定一个数,来运算。当然猜的离结果越近,运算的次数就越少。
指定一个1.5
(1.5 + 3/1.5)/ 2 = 1.25
(1.25 + 3/1.25 )/2 = 1.825
(1.825 + 3/1.825)/2 = 1.73441780...
(1.73441780.. + 3/1.73441780...)/2 = 1.7320524227
(1.732052.. + 3/1.732052...)/2 = 1.7320508075692877581042601492334.就已经离计算器算的值1.73205080756的小数点后11位结果一样了。只需要一直重复就越接近。





作者: 随便    时间: 2013-4-2 13:08
  1. public class MySqrt {
  2.         public static void main(String[] args) {
  3.                 double number = 2;
  4.                 //求一个指定数以内的值
  5.                 double randomValue = new Random().nextInt((int)number);
  6.                
  7.                 System.out.println(sqrt(number,randomValue,7));
  8.                
  9.         }
  10.         public static double sqrt(double number,double randomValue,int flag){
  11.                 double result = (randomValue + number / randomValue)/2;
  12.                 flag--;
  13.                 if(flag == 0){
  14.                         return result;
  15.                 }
  16.                 return sqrt(number,result,flag);
  17.         }
  18. }
复制代码

作者: 随便    时间: 2013-4-2 13:10
由于之前一个朋友遇到这道笔试题,没有解决。自己也想了很久没有想明白,今天抱着问问的心理。自己查到了,牛顿迭代法。就把问题解决了。
⊙﹏⊙b汗。用人笔算滴话,就太费劲了。不过是电脑运算,10次,10次都没事。
作者: 黄玉昆    时间: 2013-4-3 12:12
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者: 朱德帅    时间: 2013-4-3 12:45
我试了一个int的,double实在不会。int可以用夹逼定律,代码如下:
  1. package com.heima.practise;

  2. public class HalfTest {
  3.         public static void main(String[] args) {
  4.                 int d = 26;
  5.                 int min = 1;
  6.                 int max = d;
  7.                 try {
  8.                         System.out.println(sqrt1(min,max,d));
  9.                 } catch (Exception e) {
  10.                         // TODO Auto-generated catch block
  11.                         e.printStackTrace();
  12.                 }
  13.         }

  14.         private static int sqrt1(int min,int max,int num) throws Exception {
  15.                
  16.                 int d = num;
  17.                 int mid = (min + max)/2;
  18.                 int mid2 = mid * mid;
  19.                 if(mid2>num)
  20.                         max = mid;
  21.                 else if(mid2<num)
  22.                         min = mid;
  23.                 else
  24.                         return mid;
  25.                 if(min>=max-1){
  26.                         throw new Exception("此数没有平方根!");
  27.                 }
  28.                 return sqrt1(min,max,d);
  29.                
  30.         }


  31. }
复制代码

作者: 随便    时间: 2013-4-3 16:37
朱德帅 发表于 2013-4-3 12:45
我试了一个int的,double实在不会。int可以用夹逼定律,代码如下:

谢谢,回答。却是处理整数,也是一种方法。
作者: 随便    时间: 2013-4-7 16:47
本帖最后由 邓宫财 于 2013-4-7 16:54 编辑
  1.                 public static void main(String[] args) throws Exception {
  2.                         
  3.                 }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2