• COJ 1211 大整数开平方


    手写求大整数开根号所得到的值,具体计算过程参考别人的资料,最后利用java的大整数得到答案

     别人博客链接:http://www.cnblogs.com/Rinyo/archive/2012/12/16/2820450.html

    1.举例

    上式意为65536的开平方为256。手开方过程类似于除法计算。为了方便表述,以下仍称类似位置的数为“被除数”、“除数”、“商”。

    以65536为例,其具体计算过程如下:

    Step1:将被开方数(为了形象,表述成“被除数”,此例中即为65536)从个位往高位每两位一断写成6,55,35的形式,为了方便表述,以下每一个“,”称为一步

    Step2:从高位开始计算开方。例如第一步为6,由于22=4<6<9=32,因此只能商2(这就是和除法不同的地方,“除数”和“商”的计算位必须相同)。于是将2写在根号上方,计算开方余项。即高位余项加一步低位,此例中,即为高位余项2和低位一步55,余项即为255。

    Step3:将Step2得到的第一步开方得数2乘以20(原理在后面证明)作为第二步除数的高位。即本步除数是4x(四十几)。按照要求,本步的商必须是x。因为45×5=225<255<46×6=276,所以本步商5。

    Step4:按照类似方法,继续计算以后的各步。其中,每一步的除数高位都是20×已求出的部分商。例如第三步的除数高位就是25×20=500,所以第三步除数为50x。本例中,506×6=3036恰好能整除,所以256就是最终计算结果。

     1 import java.util.*;
     2 import java.math.*;
     3 
     4 public class Main {
     5     public static void main(String [] args)
     6     {
     7         Scanner input = new Scanner(System.in);
     8         
     9         while(input.hasNext())
    10         {
    11             String str = input.next();
    12             BigInteger num = new BigInteger(str);
    13             int len = str.length();
    14             int len1 = (len+1)/2;
    15             BigInteger factor = BigInteger.valueOf(20);
    16             BigInteger factor1 = BigInteger.valueOf(10);
    17             
    18             BigInteger div = BigInteger.valueOf(0);
    19             BigInteger ans = BigInteger.valueOf(0);
    20             BigInteger left = BigInteger.valueOf(0);
    21             int t = 0 , index = 0;
    22             if(len%2 == 1){
    23                 t = str.charAt(0)-'0';
    24                 index+=1;
    25             }else{
    26                 t = str.charAt(0)-'0';
    27                 t = t*10 + str.charAt(1)-'0';
    28                 index+=2;
    29             }
    30             int m = (int)Math.sqrt(t*1.0+0.1);
    31             ans = BigInteger.valueOf(m);
    32             div = BigInteger.valueOf(m).multiply(factor);
    33             left = BigInteger.valueOf(t-m*m);
    34         //    System.out.println(ans);
    35             BigInteger tmp = BigInteger.valueOf(0);
    36             
    37             for(int i=1 ; i<len1 ; i++ , index+=2){
    38                 left = left.multiply(BigInteger.valueOf(100));
    39                 int val = str.charAt(index)-'0';
    40                 val = val*10+str.charAt(index+1)-'0';
    41                 left = left.add(BigInteger.valueOf(val));
    42             //    System.out.println("div: "+i+" "+div+" "+left);
    43                 int j=9;
    44                 for(; j>=0 ; j--){
    45                     tmp = div.add(BigInteger.valueOf(j));
    46                     if(left.compareTo(tmp.multiply(BigInteger.valueOf(j)))>=0) break;
    47                 }
    48                 left = left.subtract(tmp.multiply(BigInteger.valueOf(j)));
    49                 ans = ans.multiply(factor1).add(BigInteger.valueOf(j));
    50                 div = ans.multiply(factor);
    51             }
    52             System.out.println(ans);
    53         }
    54     }
    55 }
  • 相关阅读:
    json转MAP
    责任链模式
    单例模式
    代理模式
    策略模式
    mysql触发器的使用
    Java 中的日期和时间
    MySQL插入数据前检测唯一性
    java字符串转为Map类型:split()方法的应用
    java Socket实例
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4498755.html
Copyright © 2020-2023  润新知