大数手算法开平方(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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值