为了实现任意大数的运算,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 的大整数平方根的实现的更多相关文章

  1. 【Java编程】Java中的大整数计算

    在上一篇文章中,我们实现了c语言中的大整数的运算,并且用Miller-Rabin算法实现了对大素数的测试.本来我准备用Java代码实现大整数的运算,查了一下资料发现Java中java.math的Big ...

  2. Java之判断大整数是否为平方数

      在本篇博客中,我们将讨论如何使用有效的算法来判断一个大整数是否为平方数.   给定正整数\(n\),如果存在一个整数\(m\),满足\(m^{2}=n\),那么则称\(n\)为平方数.因此,判断一 ...

  3. JAVA版拆分大整数为2幂的和算法

    import java.util.ArrayList; import java.util.List; public class StrTest { public static void main(St ...

  4. Java 实现大整数加减乘除

    自己用Java实现的大整数加减乘除运算.还有可以改进的地方,有兴趣的童鞋可以加以改进.仅供参考,请勿转载! package barrytest; import java.util.ArrayList; ...

  5. java环境中基于jvm的两大语言:scala,groovy

    一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...

  6. Java开发笔记(二十九)大整数BigInteger

    早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...

  7. 用Java的大整数类BigInteger来实现大整数的一些运算

    关于BigInteger的构造函数,一般会用到两个: BigInteger(String val); //将指定字符串转换为十进制表示形式: BigInteger(String val,int rad ...

  8. 基于Java的大整数运算的实现(加法,减法,乘法)学习笔记

    大整数,顾名思义就是特别大的整数. 一台64位的机器最大能表示的数字是2的64次方减一: 18446744073709551615 java语言中所能表示的整数(int)最小为-2147483648 ...

  9. java 常用类库:BigInteger大整数;BigDecimal大小数(解决double精度损失);

    大整数BigInteger package com.zmd.common_class_libraries; import java.math.BigInteger; /** * @ClassName ...

随机推荐

  1. abelkhan中的rpc框架

    rpc简介:http://www.ibm.com/developerworks/cn/aix/library/au-rpc_programming/index.html 常见的rpc框架有protob ...

  2. USACO hamming

    考试周终于过去了一半,可以继续写USACO了. 先来看一下题目吧. Hamming CodesRob Kolstad Given N, B, and D: Find a set of N codewo ...

  3. JAVA基础——类和对象

    java类与对象学习笔记 一.成员变量和局部变量 (1)定义 1.成员变量 在类中定义,用来描述对象将要有什么.(默认的成员变量值为0) 2.局部变量 在类的方法中定义,在方法中临时保存数据. 演示示 ...

  4. Azure SQL Database (23) Azure SQL Database Dynamic Data Masking动态数据掩码

    <Windows Azure Platform 系列文章目录> 我们在使用关系型数据的时候,有时候希望: - 管理员admin,可以查看到所有的数据 - 普通用户,某些敏感字段,比如信用卡 ...

  5. Agile&DevOps究竟谁是魔法棒

    天下没有神奇的配方 很抱歉,文章的开头我就要说出这个残酷的事实 - 世界上没有任何工具可以魔法般的让你实现敏捷,精益,DevOps.如果只是依赖了工具的自动化,实现了自动化Dev或者Ops,那么别忘了 ...

  6. 算法起步之kmp算法

    [作者Idlear  博客:http://blog.csdn.net/idlear/article/details/19555905]            这估计是算法连载文章的最后几篇了,马上就要 ...

  7. (cljs/run-at (JSVM. :all) "一次说白DataType、Record和Protocol")

    前言  在项目中我们一般会为实际问题域定义领域数据模型,譬如开发VDOM时自然而言就会定义个VNode数据类型,用于打包存储.操作相关数据.clj/cljs不单内置了List.Vector.Set和M ...

  8. PHP获取文件夹中的所有文件(包括子目录)

    方法一: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function tree($directory) ...

  9. 【NOIP2016】Day1 T3 换教室(期望DP)

    题目背景 NOIP2016 提高组 Day1 T3 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程安排在 n 个时间段上. ...

  10. 如何在Shell中快速切换目录

    1.回到上一次进入的路经cd -2.回到Homecd ~3.自动补齐实例,cd /usr/src/redhat,可以用cd /u[TAB]s[TAB]r[TAB]4.!$ 表示上一个命令的最后一个参数 ...