日期:2014-05-20  浏览次数:20866 次

求一个整数的N次方根
求一个整数的N次方根,N从2到无穷

如果用JAVA函数计算的话小数部分最多保留7位

而我需要保留10位小数,有没有高手能写这个算法,大家都来看看

------解决方案--------------------
public static void main(String[] args) {

  System.out.println(Math.pow(2, 1.0 / 2));

  System.out.println(root(2, 2));

  BigDecimal b = root(new BigDecimal(2), 2);
  System.out.println(b.toString());    
}


// 算法来源:http://bbs.51js.com/thread-59522-1-197.html,9楼的回帖
// 原算法使用 JavaScript 写的,使用 Java 改进了一下
// 这个算法的收敛速度很快,可以堪称优秀了
public static double root(double num, int radix) {
  double result = 1.0;
  double pow = result;
  double r = pow / result;
  double error = pow - num;
  double p = r * radix;
  double epsilon = 4.5e-16;
  while (Math.abs(error) > epsilon) {
    result = result - error / p;      
    pow = result;
    int k = 1;
    while (k < radix) {
      pow *= result;
      k++;
    }
    r = pow / result;
    error = pow - num;
    p = r * radix;
  }
  return result;
}

// BigDecimal 的 pow() 方法只能是 int 类型的,这样就不能计算
// 方根,按上述算法新增一个
public static BigDecimal root(BigDecimal num, int radix) {
  int precision = 15; // 增大可以提高运算精度
  BigDecimal result = new BigDecimal(1);
  BigDecimal pow = result;
  BigDecimal r = pow.divide(result);
  BigDecimal error = pow.subtract(num);
  BigDecimal p = r.multiply(new BigDecimal(radix));
  BigDecimal epsilon = new BigDecimal(10).pow(-precision, new MathContext(precision));
  while (error.abs().compareTo(epsilon) > 0) {
    result = result.subtract(error.divide(p, new MathContext(precision)));      
    pow = result;
    int k = 1;
    while (k < radix) {
      pow = pow.multiply(result);
      k++;
    }
    r = pow.divide(result);
    error = pow.subtract(num);
    p = r.multiply(new BigDecimal(radix));
  }
  return result;
}