手算平方根和基于 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 ...
 
随机推荐
- mysqlclient和PyMySQL对比
			
环境:Python 3.5+, Django 1.9+ 最初用django时,搜索时发现PyMySQL的文章很多,然而在django的官方文档中python3版的mysql客户端驱动确没有提到PyMy ...
 - VBS自动按键大全,vbs基本和特殊按键
			
CreateObject("Wscript.Shell") SendKeys [String] 脚本实现自动按键盘的某个键 过程是:按下F5间隔50毫秒松开F5间隔3000毫秒按下 ...
 - ES6的转换器
			
---恢复内容开始--- ES6代码转为ES5代码的转换器 1.Babel 2.Traceur,Google公司出品 Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有 ...
 - jpg、jpeg、png... 的区别
			
对于做设计这一行的人来说,这几个图片格式是最常用的,也是最常见的,几乎每一天都要与他们打交道. 刚刚入门的新人通常不知道在什么地方如何使用他们或者说如何更有效的使用他们. 那他们到底是有什么区别?(一 ...
 - jsonp的原理和实现
			
什么是JSONP? javascript高级程序设计中是这样介绍jsonp的: jsonp是JSON with padding(填充式JSON或参数式JSON )的简写,是应用JSON的一种新方法,在 ...
 - if else 与switch case判断
			
基础数据类型(四类八种 ) 不能为null. 整数型 byte 取值范围2的8次方 short 取值范围2的16次方 int 取值范围2的32次方 一般用int long 取值范围2的64次方 浮点型 ...
 - 自定义程序异常Exception
			
/** * 用于循环时的异常定位抛出异常 * 如第i行记录,抛出异常 * @author zhengwei * */ public class MyExcetion extends RuntimeEx ...
 - JavaSE中Map框架学习笔记
			
前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...
 - C# Datatable.Select()用法简介
			
dt为一个DataTable,以dt为例说明dt.select()方法的功能: 1.dt.Select() 获取所有行数 例:Datarow[] drs=dt.Select(); 此时drs为dt数据 ...
 - 利用HTML5判断用户是否正在浏览页面技巧
			
现在,HTML5里页面可见性接口就提供给了程序员一个方法,让他们使用visibilitychange页面事件来判断当前页面可见性的状态,并针对性的执行某些任务.同时还有新的document.hidde ...