原理是newton切线法,就不用介绍了吧
package com.swu.math;
import java.math.BigDecimal;
import java.math.BigInteger;
public class Test
{
//num是被开方数,n是开方次数,precision设置保留几位小数
public static String rootN_Decimal(String num,int n,int precision)
{
BigDecimal x=new BigDecimal(new BigInteger(num).divide(new BigInteger(n+"")));
BigDecimal x0=BigDecimal.ZERO;
BigDecimal e=new BigDecimal("0.1");
for(int i=1;i
e=e.divide(BigDecimal.TEN,i+1,BigDecimal.ROUND_HALF_EVEN);
BigDecimal K=new BigDecimal(num);
BigDecimal m=new BigDecimal(n);
long i=0;
while(x.subtract(x0).abs().compareTo(e)>0)
{
x0=x;
x=x.add(K.subtract(x.pow(n)).divide(m.multiply(x.pow(n-1)),precision,BigDecimal.ROUND_HALF_EVEN));
++i;
}
return x+" "+i;
}
public static void main(String[] args)
{
BigInteger b=new BigInteger("123456789123456789123456789");
b=b.pow(10);
System.out.println(rootN_Decimal(b.toString(), 10, 2));
}
}
运行结果
123456789123456789123456789.00 5117