java中的高精度加减乘除

java中的高精度加减乘除

  • 1、高精度加法
    • 高精度加法思路
  • 2、高精度减法
    • 高精度减法思路
  • 3、高精度乘法
    • 高精度乘法思路
  • 4、高精度除法
  • 高精度除法思路
  • 5、java中BigInteger与BigDecimal的高精度加减乘除
    • BigIneger处理整数运算:
    • BigDecimal处理浮点数运算:

1、高精度加法

用代码体现运算过程

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String a = bf.readLine();
        String b = bf.readLine();
        List<Integer> list = add(a , b);
        for(int i = list.size()-1;i>=0;i--){
            System.out.print(list.get(i));
        }
    }
    public static List<Integer> add(String a, String b){
        int i = a.length()-1;
        int j = b.length()-1;
        List<Integer> res = new ArrayList<>();
        int t = 0;
        for(;i>=0||j>=0 ;i--,j--){
            t+=(i>=0?a.charAt(i)-'0':0)+(j>=0?b.charAt(j)-'0':0);
            res.add(t%10);
            t = t/10;
        }
        if(t!=0)res.add(t);
        return res;
    }
}

高精度加法思路

用中间变量t表示进位情况,t%10为当前位的值,t/10为下一位的进位情况
值得一提的是,高精度储存结果中是下标值小的存储位数低的,也就是从个位开始存,取得时候需要从高位开始取。

2、高精度减法

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class GaoJingJian {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String a = bf.readLine();
        String b = bf.readLine();

        ArrayList<Integer> aa = new ArrayList<>();
        ArrayList<Integer> bb = new ArrayList<>();
        for(int i = a.length()-1;i>=0;i--){
            aa.add(a.charAt(i)-'0');
        }
        for(int i = b.length()-1;i>=0;i--){
            bb.add(b.charAt(i)-'0');
        }

        if(check(a , b)){
            List<Integer> cc = sub(aa , bb);
            for(int i = cc.size()-1;i>=0;i--){
                System.out.print(cc.get(i));
            }
        }else {
            List<Integer> cc = sub(bb , aa);
            System.out.print('-');
            for(int i = cc.size()-1;i>=0;i--){
                System.out.print(cc.get(i));
            }
        }
    }
    public static boolean check(String a , String b){
        if(a.length()!=b.length()){
            return a.length()>b.length();
        }

        for(int i = 0;i<a.length();i++){
            if(a.charAt(i)!=b.charAt(i)){
                return a.charAt(i)>b.charAt(i);
            }
        }

        return true;
    }
    public static List<Integer> sub(ArrayList<Integer> a , ArrayList<Integer> b){
        List<Integer> list = new ArrayList<>();

        for(int i = 0 , t = 0;i<a.size();i++){
            t = a.get(i) - t;

            if(i<b.size()) t = t - b.get(i);
            list.add((t+10)%10);
            if(t<0) t = 1;else t = 0;
        }

        int i = list.size()-1;
        while(i>0){
            if(list.get(i)==0){
                i--;
            }else break;
        }
        return list.subList(0 , i+1);
    }
}

高精度减法思路

首先判断两个数大小,通过判断结果决定是否输出负号

然后利用一个变量t表示向前借位,(t+10)%10,如果t为整数,那么该数不变,最后将该数赋值为0,如果t为负数,那么该数成功向前一位借位,最后将该数赋值为1。

最后去除前导零。

3、高精度乘法

import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String a = br.readLine();
        int bb = Integer.valueOf(br.readLine());

        ArrayList<Integer> aa = new ArrayList<Integer>();

        for (int i = a.length() - 1; i >= 0; i--){
            aa.add(a.charAt(i) - '0');
        }



        ArrayList<Integer> c = add2(aa,bb);
        boolean t = true;
        for(int k = c.size() - 1; k >= 0 ; k--){
            if(c.get(k) == 0 && t && k >= 1) continue;
            System.out.print(c.get(k));
            t = false;
        }

    }

    public static ArrayList<Integer> add2(ArrayList<Integer> aa, int bb){
        ArrayList<Integer> c = new ArrayList<Integer>();
        int t = 0;
        for(int i = 0; i < aa.size(); i++){

            t += aa.get(i) * bb;

            c.add((t % 10));
            t /= 10;
        }
        if (t > 0) c.add(t);
        int i = 0;

        return c;
    }
}

高精度乘法思路

乘法和除法与加减法思路不一样的地方在于,传入的两个参数一个是高精度,一个是低精度,高精度参数用集合表示,用每一位的数字去乘以低精度数,并将个位存入结果集。与加法思路大概一殊途同归。

4、高精度除法


import java.io.*;
import java.util.*;

public class Main{
    static int r = 0;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String a = br.readLine();
        int bb = Integer.valueOf(br.readLine());

        ArrayList<Integer> aa = new ArrayList<Integer>();

        for (int i = a.length() - 1; i >= 0; i--){
            aa.add(a.charAt(i) - '0');
        }



        ArrayList<Integer> c = add2(aa,bb);
        boolean t = true;
        for(int k = 0; k <c.size() ; k++){
            if(c.get(k) == 0 && t && k <c.size()-1) continue;
            System.out.print(c.get(k));
            t = false;
        }
        System.out.println();
        System.out.println(r);
    }

    public static ArrayList<Integer> add2(ArrayList<Integer> aa, int bb ){
        ArrayList<Integer> c = new ArrayList<Integer>();

        for(int i = aa.size()-1;i>=0;i--){
            r = r*10 + aa.get(i);
            c.add(r/bb);
            r %=bb;
        }
        return c;
    }
}

高精度除法思路

从高位开始除以除数,r到最后表示余数。

5、java中BigInteger与BigDecimal的高精度加减乘除

BigIneger处理整数运算:

import java.math.BigInteger;
import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        BigInteger a = new BigInteger(reader.readLine());
        BigInteger b = new BigInteger(reader.readLine());
        //加法
        System.out.println(a.add(b));
 		//减法
 		System.out.println(a.subtract(b));
 		//乘法
 		System.out.println(a.multiply(b));
 		//除法
 		System.out.println(a.divide(b));
 		//返回值为a/b
 		System.out.println(a.divideAndRemainder(b));
 		//返回值为数组,分别为a/b,a%b
        reader.close();
    }
}


BigDecimal处理浮点数运算:

import java.io.*;
import java.math.BigDecimal;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BigDecimal a = new BigDecimal(reader.readLine());
        BigDecimal b = new BigDecimal(reader.readLine());
        //加法
        System.out.println(a.add(b));
 		//减法
 		System.out.println(a.subtract(b));
 		//乘法
 		System.out.println(a.multiply(b));
 		//除法
 		System.out.println(a.divide(b));
        reader.close();
    }
}

评价:还是BigInteger和BigDecimal好用,但如果考试中禁用了这两个类的话,高精度运算的思路也要会。

你可能感兴趣的:(java,jvm,数据结构,算法)