手算平方根和基于 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的平方根。手工是这样做的。
同理计算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<len/2;++i) //得到的平方根一定是len/2位
{
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 BigInteger 的大整数平方根的实现的更多相关文章
- 【Java编程】Java中的大整数计算
在上一篇文章中,我们实现了c语言中的大整数的运算,并且用Miller-Rabin算法实现了对大素数的测试.本来我准备用Java代码实现大整数的运算,查了一下资料发现Java中java.math的Big ...
- Java之判断大整数是否为平方数
在本篇博客中,我们将讨论如何使用有效的算法来判断一个大整数是否为平方数. 给定正整数\(n\),如果存在一个整数\(m\),满足\(m^{2}=n\),那么则称\(n\)为平方数.因此,判断一 ...
- JAVA版拆分大整数为2幂的和算法
import java.util.ArrayList; import java.util.List; public class StrTest { public static void main(St ...
- Java 实现大整数加减乘除
自己用Java实现的大整数加减乘除运算.还有可以改进的地方,有兴趣的童鞋可以加以改进.仅供参考,请勿转载! package barrytest; import java.util.ArrayList; ...
- java环境中基于jvm的两大语言:scala,groovy
一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...
- Java开发笔记(二十九)大整数BigInteger
早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...
- 用Java的大整数类BigInteger来实现大整数的一些运算
关于BigInteger的构造函数,一般会用到两个: BigInteger(String val); //将指定字符串转换为十进制表示形式: BigInteger(String val,int rad ...
- 基于Java的大整数运算的实现(加法,减法,乘法)学习笔记
大整数,顾名思义就是特别大的整数. 一台64位的机器最大能表示的数字是2的64次方减一: 18446744073709551615 java语言中所能表示的整数(int)最小为-2147483648 ...
- java 常用类库:BigInteger大整数;BigDecimal大小数(解决double精度损失);
大整数BigInteger package com.zmd.common_class_libraries; import java.math.BigInteger; /** * @ClassName ...
随机推荐
- 【原】无脑操作:eclipse + maven搭建SSM框架
网上看到一些Spring + Spring MVC + MyBatis框架的搭建教程,不是很详细或是时间久远了,自己动手整一个简单无脑的! 0.系统环境 1)Windows 10 企业版 2)JDK ...
- 在线SVN仓库实现:金山快盘+TortoiseSVN(Win)+SCPlugin(Mac)
前段时间一直在研究SVN在线托管,也尝试了网上推荐的免费托管网站. 但毕竟是是免费的,还是要受到比如空间大小.私有性等这样那样的限制,感觉有些麻烦. 而且,比较心疼自己在本地开发的时候积累的更新日志, ...
- Thrift总结(二)创建RPC服务
前面介绍了thrift 基础的东西,怎么写thrift 语法规范编写脚本,如何生成相关的语言的接口.不清楚的可以看这个<Thrift总结(一)介绍>.做好之前的准备工作以后,下面就开始如何 ...
- 使用CodeDOM动态编译一个字符串表达式
由于程序需要,计算的表达式使用字符串传输,这样对运算造成了影响.在程序中直接执行这段表达式可以得到值, 但是使用字符串就没有办法运算了, 所以想到用CodeDOM将这段字符串拼接在代码中编译 类似st ...
- Vijos 1010 清帝之惑之乾隆
背景 乾隆,雍正的第四子,在位60年,退位后又当了三年太上皇,终年89岁. 乾隆即位之初,实行宽猛互济的政策,务实足国,重视农桑,停止捐纳,平定叛乱等一系列活动中,充分体现了他的文治武功,乾隆帝向慕风 ...
- Java WebService学习资料
最近用到了WebService,以前没用过,想要好好学习一下.感觉网上资料比较少,而且很杂,找了很久,觉得下面的两个文章解释的比较清楚,分享一下: WebService概念.原理:http://mp. ...
- FAT文件系统学习和思考
FAT(File Allocation Table)文件系统 前两天面试,导师说我基础差,要赶紧补起来了.今天晚上看了FAT32文件系统,基本的信息都是百度百科中"FAT文件系统" ...
- 【hibernate初探】之接口说明,session使用
hibernate作为一个完整的ORM映射框架,通过配置即可以让我们从复杂的JDBC操作中脱离出来.hibernate封装了 JDBC,JTA(java transaction API) 和JNDI. ...
- Java 逆变与协变的名词说明
最近在研究Thinking in Java的时候,感觉逆变与协变有点绕,特意整理一下,方便后人.我参考于Java中的逆变与协变,但是该作者整理的稍微有点过于概念化,我在这里简单的说一下 我对于协变于逆 ...
- Docker快速入门
Docker已经火了很长一段时间,最近打算在阿里云上好好熟悉一下Docker的相关应用,为今后的工作做准备. 基本概念 Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是do ...