为了实现任意大数的运算,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的平方根。手工是这样做的。

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

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 何処へ行くの

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

  1. java 数据校验框架_自己写的基于java Annotation(注解)的数据校验框架

    JavaEE6中提供了基于java Annotation(注解)的Bean校验框架,Hibernate也有类似的基于Annotation的数据校验功能,我在工作中,产品也经常需要使 用数据校验,为了方 ...

  2. java基本语法借阅_课内资源 - 基于Java和MySql实现的光盘借阅管理系统

    一.需求设计以下几个类:光盘类:用户类:借阅记录类,包括下列模块: 新建.修改.删除光盘信息 新建.修改.删除用户信息 光盘借阅/归还信息记录 查询光盘名称,用户的借阅历史 要求:基于JFrame窗体 ...

  3. python整数池_【Python】Python中神奇的小整数对象池和大整数对象池

    小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立 ...

  4. java青蛙过河打字_趣味算法——青蛙过河(JAVA)

    青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有3只青蛙,这些青蛙只能向前移动,不能向后移动,且一次只能有一只青蛙向前移动.在移动过程中,青蛙可以向 ...

  5. java护照号码校验_学无止境之小白学java……第001天

    学习主题:预科阶段 对应视频: http://www.itbaizhan.cn/course/id/18.html 对应作业: 1. 为什么需要学编程,什么样的人可以做程序员? 编程是现实逻辑的表达, ...

  6. java 优秀源码_想要快速进阶Java架构师?这份超强(长)学习计划单 请签收!...

    优秀工程师的成长之路就是一条不断打怪升级之路的"修仙之路"! 而Java程序员一向比别人更难,如果说大家都在修仙的话,java程序员简直神似"剑修",入行枯燥精 ...

  7. java 并发编程多线程_多线程(一)java并发编程基础知识

    线程的应用 如何应用多线程 在 Java 中,有多种方式来实现多线程.继承 Thread 类.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实现带 ...

  8. java引用公共类_使用键引用从Java公共类获取值 - java

    我们有一个Java公共类, public class Test { public class ob1 { public static final String test = "T1T1&qu ...

  9. java 启动内存参数_请问该如何设置Java虚拟机JVM启动内存参数?

    jps(JVM Process Status Tool):JVM机进程状况工具 用来查看基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等.与unix上的ps类似,用 ...

  10. java新手练习项目_有哪些好的java项目适合新手练习?

    要想学好java技术,找到高薪工作,不仅要掌握扎实的理论知识,也要有一定的实操能力. 遇到问题多查多问,可以上网站进行搜索,可以加一些交流群,还可以多问学校的老师--另外要学会欣赏他人的代码,向成功者 ...

最新文章

  1. android对话框的使用(下)
  2. 任务管理平台_软件品质评测系统任务分发管理平台
  3. CentOS四种方法自建yum仓库
  4. IDC敲黑板啦:未来企业IT以混合云为主
  5. 使用C#开发ActiveX控件
  6. 学习VIM之2014
  7. Atitit 提升扩展性 自由化理念 参数 第一章 前瞻性设计 第二章  自由化理念 自由化参数 json map等半结构化参数,dsl等全功能参数 自由化功能接口 dsl 自由化返回
  8. c语言如何实现单进程,如何用C语言实现多线程
  9. 碧海威 L7多款产品 后台命令执行漏洞
  10. 申请公网IP实战 #华北天津联通
  11. win10安装visio2010出错_win10安装office2010时显示错误1907如何解决
  12. Referrer 还是 Referer?
  13. 苹果搜索广告ASA开户教程
  14. 无法使用内置管理员账户打开Microsoft Edge
  15. java做类似于qq空间动态加载_Android仿QQ空间动态界面分享功能
  16. Unity中鼠标的锁定与解锁
  17. 壁纸 - 精选海量高清图片与桌面背景
  18. 简述python文件操作的流程_Python文件操作详解
  19. TeamTalk部署详细过程(跳过各种坑)
  20. JAVA——制作java程序说明书、解决DOS下中文编码问题 GBK

热门文章

  1. 基于SSM框架的流浪动物猫狗救助领养网站设计
  2. Docker:小白之路 一plus (拉取镜像加速篇)
  3. 菜鸟怎么用.Net Core 实现QQ登录
  4. pycaret实现CTG分类案例
  5. python生成大量随机信息,并保存到Excel文件中
  6. Android应用开发-小巫CSDN博客客户端UI篇,成功从小公司跳槽
  7. 小白易学--ps钢笔工具抠图教程-大长腿抠图
  8. 45.Django06
  9. lol2月20服务器维护,英雄联盟2月20日维护到几点 今天LOL几点可以进游戏
  10. matlab程序4名商人,商人们怎样安全过河附MATLAB程序完整.doc