package com.swu.math;
import java.math.BigInteger;
public class Test
{
public static String sqrt(String num)
{
BigInteger b=new BigInteger(num);
//不用多解释了吧
if(b.compareTo(BigInteger.ZERO)<0)
return "不是正数";
String sqrt="0"; //开方结果
String pre="0"; //开方过程中需要计算的被减数
BigInteger trynum; //试商,开放过程中需要计算的减数
BigInteger flag; //试商,得到满足要求减数的之后一个数
BigInteger twenty=new BigInteger("20"); //就是20
BigInteger dividend; ///开方过程中需要计算的被减数
int len=num.length(); //数字的长度
if(len%2==0) //长度为偶数
{
for(int i=0;i
{
dividend=new BigInteger(pre+num.substring(2*i,2*i+2));
for(int j=0;j<=9;++j)
{
trynum=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger(j+"")).add(new BigInteger(j+"").multiply(new BigInteger(j+"")));
flag=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger((j+1)+"")).add(new BigInteger((j+1)+"").multiply(new BigInteger((j+1)+"")));;
//满足要求的j使得试商与计算中的被减数之差为最小正数
if(trynum.subtract(dividend).compareTo(BigInteger.ZERO)<=0
&&flag.subtract(dividend).compareTo(BigInteger.ZERO)>0)
{
sqrt+=j; //结果加上得到的j
pre=dividend.subtract(trynum).toString(); //更新开方过程中需要计算的被减数
break;
}
}
}
}
else //长度为奇数
{
for(int i=0;i
{
if(i==0) //奇数位被开方数首位特殊处理
dividend=new BigInteger(num.charAt(0)+"");
else
dividend=new BigInteger(pre+num.substring(2*i-1,2*i+1));
for(int j=0;j<=9;++j)
{
trynum=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger(j+"")).add(new BigInteger(j+"").multiply(new BigInteger(j+"")));
flag=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger((j+1)+"")).add(new BigInteger((j+1)+"").multiply(new BigInteger((j+1)+"")));;
//满足要求的j使得试商与计算中的被减数之差为最小正数
if(trynum.subtract(dividend).compareTo(BigInteger.ZERO)<=0
&&flag.subtract(dividend).compareTo(BigInteger.ZERO)>0)
{
sqrt+=j; //结果加上得到的j
pre=dividend.subtract(trynum).toString(); //更新开方过程中需要计算的被减数
break;
}
}
}
}
return sqrt.substring(1);
}
public static void main(String[] args)
{
System.out.println(MathTool.sqrt("1234567890123456789"));
System.out.println(Math.sqrt(1234567890123456789l));
}
}