大数手算法开平方(Java实现)
2018-03-07 20:09
363 查看
1. 手算法开平方原理:
2. Java代码:
具体步骤(观察图片以计算
2. Java代码:
1. 手算法开平方原理:
话不多说直接上图:具体步骤(观察图片以计算
除法的方式写出来):
1.首先从小数点开始向左向右将数字两两分组 2.然后从前往后依次选取2位数 3.对于第1组数字remainder(余数),求出一个shang(商),使得shang²≤remainder,将shang写在对应的2个数字上面 4.令结果result为最上面横线上的数字,为所有的的shang的组合 5.然后求得remainder-shang²,令为z 6.取第2组数字与z组成新的remainder 7.现在求新的remainder的shang,使得(20*result+shang)*shang≤remainder 8.然后求remainder-(20*result+shang)*shang
其实,第1组数字也不需要特殊处理,可以使用后面一样的公式计算shang和z,这个时候将result初始化为0就是了
2. Java代码:
import java.math.BigInteger; import java.util.Scanner; public class Main { final static BigInteger NUM20 = BigInteger.valueOf(20);// 将后面使用的参数定义为final常量 public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println(kaifang(input.next)); } // 手算法开方 public static String kaifang(String s) { String result = "0";// 结果初始化为字符串0 String remainder = "";// 余数 if (s.length() % 2 != 0)// 将字符串长度变为偶数 s = "0" + s; for (int i = 0; i < s.length() / 2; i++) {// 两两分组 remainder += s.substring(i * 2, (i + 1) * 2);// 余数为之前的结果加上后面2个数字 int shang = f1(new BigInteger(remainder), new BigInteger(result)); remainder = f2(new BigInteger(remainder), new BigInteger(result), BigInteger.valueOf(shang)) + ""; result += shang; } return result.substring(1);// 去掉结果之前的0 } // public static int f1(int remainder, int result) { // int i; // for (i = 9; i >= 0; i--) // if ((result * 20 + i) * i <= remainder) // break; // return i; // } // // public static int f2(int remainder, int result, int shang) { // return remainder - (result * 20 + shang) * shang; // } public static int f1(BigInteger remainder, BigInteger result) { int i; for (i = 9; i >= 0; i--) { BigInteger NUMI = BigInteger.valueOf(i); if (result.multiply(NUM20).add(NUMI).multiply(NUMI).compareTo(remainder) <= 0) break; } return i; } public static String f2(BigInteger remainder, BigInteger result, BigInteger shang) { return remainder.subtract(result.multiply(NUM20).add(shang).multiply(shang)).toString(); } }
几点注意:
1.由于int和Integer无法存储大数,所以这里大数之间的运算会使用到BigInteger,但是最开始是使用String存储大叔,便于将数字两两分组与提取出来
2.因为是两两分组,所以为了后面操作方便,这里首先判断是不是偶数个数字,如果不是的话在最前面加上数字0
3.为了统一操作,将result首先初始化为字符串0
相关文章推荐
- 大数相乘问题--算法思想及Java实现解析(附详细注释)
- 大数算法 -- 正整数相乘(Java 实现)
- java实现大数减法算法
- java中不用Math.sqrt,实现开平方根的算法
- 用java实现的素数第二种算法
- 中国农历算法java实现(转自Herong Yang)
- Java中的几种算法的实现
- 用Java实现归并排序(Merge-Sort)算法
- java实现的18位身份证格式验证算法
- FIFO与LRU 算法实现(java)
- AIX 程序设计大赛-AIX正方形问题算法及Java程序实现(方案二)
- 图象细化算法实现的java applet源代码
- 八皇后问题 java实现,算法两则
- java的几种算法的实现
- java实现的18位身份证格式验证算法
- java归并算法实现
- Java和C#摘要算法实现
- 在java中实现图形学中的直线算法
- 图像边缘检测(Canny 算法)的Java实现
- AIX 程序设计大赛-AIX正方形问题算法及Java程序实现(方案三)