zoukankan      html  css  js  c++  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的平方根。手工是这样做的。

    同理计算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 何処へ行くの
    
  • 相关阅读:
    python字符串连接方式(转)
    Python顺序与range和random
    将EXCEL中的列拼接成SQL insert插入语句
    Python OS模块
    Python3.5连接Mysql
    Mysql查看连接端口及版本
    Mysqldb连接Mysql数据库(转)
    Python 文件I/O (转)
    Python 日期和时间(转)
    Python序列的方法(转)
  • 原文地址:https://www.cnblogs.com/Kalafinaian/p/6980313.html
Copyright © 2011-2022 走看看