java 大整数平方根_手算平方根和基于 Java BigInteger 的大整数平方根的实现

为了实现任意大数的运算,long用BigInteger替换带哦。

好了废话少数,先说数学原理,也就是手算平方根计算机代码实现!那么什么叫手算平方根了???

手开方图解

据说前苏联的普通工人都会的(毛熊国果然是一个神奇的国度!听到这里我背脊发冷,再次膜拜俄罗斯基础数!!和那令人望而生畏的吉米多维奇了!!! )

它的计算步骤如下:

1.将被开方数的整数部分从个位起向左每隔两位划为一段,用撇号分开分成几段,表示所求平方根是几位数;

2.根据左边第一段里的数,求得平方根的最高位上的数;

3.从第一段的数减去最高位上数的平方,在它们的差的右边写上第二段数组成第一个余数

4.把求得的最高位数乘以20去试除第一个余数,所得的最大整数作为试商;

5.用商的最高位数的20倍加上这个试商再乘以试商.如果所得的积小于或等于余数,试商就是平方根的第二位数;如果所得的积大于余数,就把试商减小再试;

6.用同样的方法,继续求平方根的其他各位上的数.

实例的说明

1.如求529的算术平方根时先由个位向左两位两位地定位:定位为5,29,接着象一般除法那样列出除式.

2.先从最高位用最大平方数试商:最大平方数不超过5的是2,得商后,除式5-4后得1。把商2写上除式

3.加上下一位的数:得129。

4.用20去乘商后去试商129:2×20=40。因为129/40的整数部分为3.所以可试商为3

5.那就把试商的3加上40去除129。得129÷43=3,把3写上除式上

6.这时129-129=0,无余数啦。

7.这时除式上的商是23,即是529的平方根。手工是这样做的。

ed1c4db0962ecb2c745b0b43cbdd9fe7.png

同理计算10517049的平方根也同理

48d3e9d8e276ea67cbda265a924b563f.png

Java

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 _20=new BigInteger("20"); //就是20

BigInteger dividend; ///开方过程中需要计算的被减数

BigInteger A; //(10*A+B)^2=M

BigInteger B;

BigInteger BB;

int len=num.length(); //数字的长度

if(len%2==1) //长度是奇数的画,首位补上1个0凑成偶数位

{

num="0"+num;

len++;

}

for(int i=0;i

{

dividend=new BigInteger(pre+num.substring(2*i,2*i+2));

A=new BigInteger(sqrt);

for(int j=0;j<=9;++j)

{

B=new BigInteger(j+"");

BB=new BigInteger((j+1)+"");

trynum=_20.multiply(A).multiply(B).add(B.pow(2));

flag=_20.multiply(A).multiply(BB).add(BB.pow(2));;

//满足要求的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));

}

}

运行结果

1111111106

1.1111111061111112E9

Author by : Kalafianian

本当は空を飞べると知っていたから

羽ばたくときが怖くて风を忘れた

Oblivious 何処へ行くの

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值