手写求大整数开根号所得到的值,具体计算过程参考别人的资料,最后利用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 }

COJ 1211 大整数开平方的更多相关文章

  1. poj2389-Bull Math(大整数乘法)

    一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425  5 5 5  5 5 ...

  2. AC日记——大整数的因子 openjudge 1.6 13

    13:大整数的因子 总时间限制:  1000ms 内存限制:  65536kB 描述 已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k. 输入 ...

  3. Ac日记——大整数减法 openjudge 1.6 11

    11:大整数减法 总时间限制:  1000ms 内存限制:  65536kB 描述 求两个大的正整数相减的差. 输入 共2行,第1行是被减数a,第2行是减数b(a > b).每个大整数不超过20 ...

  4. AC日记——大整数加法 openjudge 1.6 10

    10:大整数加法 总时间限制:  1000ms 内存限制:  65536kB 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 ...

  5. vijos-1447 开关灯泡-大整数开方算法

    描述 一个房间里有n盏灯泡,一开始都是熄着的,有1到n个时刻,每个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 提示 范围:40 ...

  6. poj2305-Basic remains(进制转换 + 大整数取模)

    进制转换 + 大整数取模一,题意: 在b进制下,求p%m,再装换成b进制输出. 其中p为b进制大数1000位以内,m为b进制数9位以内二,思路: 1,以字符串的形式输入p,m; 2,转换:字符串-&g ...

  7. [转载]JavaScript 中小数和大整数的精度丢失

    标题: JavaScript 中小数和大整数的精度丢失作者: Demon链接: http://demon.tw/copy-paste/javascript-precision.html版权: 本博客的 ...

  8. ACM学习之路————一个大整数与一个小整数不得不说得的秘密

    这个相对于两个大整数的运算来说,只能说是,low爆了. 只要利用好除法的性质,这类题便迎刃而解.O(∩_∩)O哈哈~ //大整数除一个int数 #include<iostream> #in ...

  9. 华为"128为大整数相加"机试题

    最近正直春招,偶尔接触到了华为的这道大整数相加的测试题,在网上找了一个算法,然后自己尝试进行了优化,最后也对memmove()函数效率有了进一步把握. #include <time.h># ...

随机推荐

  1. repeater使用

    Repeater: HeaderTemplate - 在加载开始执行一遍 ItemTemplate - 有多少条数据,执行多少遍 FooterTemplate - 在加载最后执行一遍 Alternat ...

  2. MySQL 当记录不存在时insert,当记录存在时更新

    网上基本有三种解决方法. 第一种: 示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (clie ...

  3. CF962E Byteland, Berland and Disputed Cities

    思路: http://codeforces.com/blog/entry/58869. 实现: #include <bits/stdc++.h> using namespace std; ...

  4. JavaScript创建对象的七种方法

    一. 工厂模式 创建: function createPerson(name,behavior){ var p=new Object(); p.name=name; p.behavior=behavi ...

  5. jsapi4加载的首个图层的范围被默认作为地图范围,且不能修改的解决

    在map加载的第一个图层的图层范围(fullExtent),会被默认设置为map的全图范围,且不能更改,从一般地图控件角度来说,应该有fullExtent属性,作为地图的全图范围,但很遗憾jsapi4 ...

  6. 计算1至n的k次方的和

    package com.ywx.count; import java.util.Scanner; /** * @author Vashon * date:20150410 * 题目:计算1至n的k次方 ...

  7. 时间插件-daterangepicker

    一款基于bootstrap的时间插件daterangepicker,顾名思义,主要用于时间区间选择,也可做单个时间选择 demo.1汉化版的一个时间选择案例 <!DOCTYPE html> ...

  8. Navicat工具备份还原mysql数据库详细图解

    Navicat是个很不错的MYSQL数据库管理工具,我们常用的还web形式的phpmyadmin和font这三种了,都是非常不错的mysql管理工具.因为Navicat工具兼容性比较好,操作也比较简单 ...

  9. zabbix告警邮件、短信发送错误快速排查方法

    zabbix告警邮件.短信发送错误快速排查方法 背景 zabbix告警邮件.短信经常有同事反馈发送错误的情况,这个问题排查的角度很多,那么最快捷的角度是什么呢? 在我看来,最快的角度就是判断这个告警邮 ...

  10. java 随机数 <%=System.currentTimeMillis() %>

    java 随机数<c:set var="version" value="<%=System.currentTimeMillis() %>"/& ...