本来是为我上学期写好的MathTool工具类转化也就是原来这个工具类的方法参数类型是long为了实现任意大数的运算long用BigInteger替换带哦
好了废话少数先说数学原理也就是手算平方根计算机代码实现!那么什么叫手算平方根了???
手开方
据说前苏联的普通工人都会的(毛熊国果然是一个神奇的国度!听到这里我背脊发冷再次膜拜俄罗斯基础数!!和那令人望而生畏的吉米多维奇了!!! )
它的计算步骤如下
.将被开方数的整数部分从个位起向左每隔两位划为一段用撇号分开(竖式中的)分成几段表示所求平方根是几位数
.根据左边第一段里的数求得平方根的最高位上的数(竖式中的)
.从第一段的数减去最高位上数的平方在它们的差的右边写上第二段数组成第一个余数(竖式中的)
.把求得的最高位数乘以去试除第一个余数所得的最大整数作为试商(×除 所得的最大整数是 即试商是)
.用商的最高位数的倍加上这个试商再乘以试商.如果所得的积小于或等于余数试商就是平方根的第二位数如果所得的积大于余数就把试商减小再试(竖式中(×+)×=说明试商就是平方根的第二位数)
.用同样的方法继续求平方根的其他各位上的数.
一个实例
()如求的算术平方根时先由个位向左两位两位地定位定位为接着象一般除法那样列出除式
()先从最高位用最大平方数试商最大平方数不超过的是得商后除式后得把商写上除式
()加上下一位的数得
()用去乘商后去试商×= 这可试商为那就把试商的加上去除得÷=把写上除式上这时=
()加上下一位的数得
()用去乘商后去试商×= 这可试商为那就把试商的加到去除得把写上除式上这时=无余数啦
()这时除式上的商是即是的平方根手工是这样做的写得罗嗦了但望能看懂
package comswumath;
import javamathBigInteger;
public class Test
{
public static String sqrt(String num)
{
BigInteger b=new BigInteger(num);
//不用多解释了吧
if(pareTo(BigIntegerZERO)<)
return 不是正数;
String sqrt=; //开方结果
String pre=; //开方过程中需要计算的被减数
BigInteger trynum; //试商开放过程中需要计算的减数
BigInteger flag; //试商得到满足要求减数的之后一个数
BigInteger twenty=new BigInteger(); //就是
BigInteger dividend; ///开方过程中需要计算的被减数
int len=numlength(); //数字的长度
if(len%==) //长度为偶数
{
for(int i=;i<len/;++i) //得到的平方根一定是len/位
{
dividend=new BigInteger(pre+numsubstring(*i*i+));
for(int j=;j<=;++j)
{
trynum=twentymultiply(new BigInteger(sqrt))multiply(new BigInteger(j+))add(new BigInteger(j+)multiply(new BigInteger(j+)));
flag=twentymultiply(new BigInteger(sqrt))multiply(new BigInteger((j+)+))add(new BigInteger((j+)+)multiply(new BigInteger((j+)+)));;
//满足要求的j使得试商与计算中的被减数之差为最小正数
if(trynumsubtract(pareTo(BigIntegerZERO)<=
&&flagsubtract(pareTo(BigIntegerZERO)>)
{
sqrt+=j; //结果加上得到的j
pre=dividendsubtract(trynum)toString(); //更新开方过程中需要计算的被减数
break;
}
}
}
}
else //长度为奇数
{
for(int i=;i<len/+;++i) //得到的平方根一定是len/+位
{
if(i==) //奇数位被开方数首位特殊处理
dividend=new BigInteger(numcharAt()+);
else
dividend=new BigInteger(pre+numsubstring(*i*i+));
for(int j=;j<=;++j)
{
trynum=twentymultiply(new BigInteger(sqrt))multiply(new BigInteger(j+))add(new BigInteger(j+)multiply(new BigInteger(j+)));
flag=twentymultiply(new BigInteger(sqrt))multiply(new BigInteger((j+)+))add(new BigInteger((j+)+)multiply(new BigInteger((j+)+)));;
//满足要求的j使得试商与计算中的被减数之差为最小正数
if(trynumsubtract(pareTo(BigIntegerZERO)<=
&&flagsubtract(pareTo(BigIntegerZERO)>)
{
sqrt+=j; //结果加上得到的j
pre=dividendsubtract(trynum)toString(); //更新开方过程中需要计算的被减数
break;
}
}
}
}
return sqrtsubstring();
}
public static void main(String[] args)
{
Systemoutprintln(MathToolsqrt());
Systemoutprintln(Mathsqrt(l));
}
}