- 注册时间
- 2009-7-21
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 4489
- 在线时间
- 小时
|
发表于 2009-8-11 21:22:31
|
显示全部楼层
import java.math.BigDecimal;
import java.math.MathContext;
public class root
{
public static void main(String[] args) {
/*
System.out.println(Math.pow(2, 1.0 / 5));
System.out.println(root(2, 5));
BigDecimal b = root(new BigDecimal(2), 5);
System.out.println(b.toString());
//可以用下面两条Java句子解决:
System.out.println(Integer.MAX_VALUE);//打印最大整数:2147483647
System.out.println(Integer.MIN_VALUE);//打印最小整数:-2147483648
//相应的浮点数:
System.out.println(Float.MAX_VALUE);
System.out.println(Float.MIN_VALUE);
//双精度:
System.out.println(Double.MAX_VALUE);
System.out.println(Double.MIN_VALUE);
for(int n=1;n<=14;n++)
label1:for(int m=1;m<=200;m++)
for(int j=1;j<9;j++)
{
if(Math.floor(Math.pow(Math.pow(10,m)*(Math.pow(10,n)-1)/9*j,1.0/n))+1
==Math.floor(Math.pow(Math.pow(10,m)*((Math.pow(10,n)-1)/9*j+1),1.0/n)))
{
System.out.print(n+":\t");
System.out.println(Math.floor(Math.pow(Math.pow(10,m)*((Math.pow(10,n)-1)/9*j+1),1.0/n)));
break label1;
}
}
*/
BigDecimal ONE=BigDecimal.ONE;
BigDecimal TEN=BigDecimal.TEN;
BigDecimal N9=TEN.subtract(ONE);
for(int n=1;n<=14;n++)
label2:for(int m=1;m<=200;m++)
for(int j=1;j<9;j++)
{
BigDecimal J=new BigDecimal(j);
BigDecimal M=root(TEN.pow(m).multiply(TEN.pow(n).add(ONE.negate()).divide(N9).multiply(J)),n).add(ONE);
BigDecimal N=root(TEN.pow(m).multiply(TEN.pow(n).add(ONE.negate()).divide(N9).multiply(J).add(ONE)),n);
if(M.toBigInteger().compareTo(N.toBigInteger())==0)
{
System.out.print(n+":\t");
System.out.println(M.toBigInteger());
break label2;
}
}
}
// 算法来源: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 = 1.0e-10;
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 = 6; // 增大可以提高运算精度
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;
}
} |
|