用java实现高精度

1.前言

高精度主要用于C/C++中,两个比较的整数相加减,一大一小整数相乘除,范围大概是数的长度小于等于10的6次方。但是在java和Python中就用到的比较少了,因为java中有BigInteger的存在,位数是由内存决定的;而Python中就不限定位数

2.为什么要用高精度

当两个数向加或乘,位数已经超出long long 的范围,就会使数变得不准确,这时,我们就会想到用数组来存放一个数的大小,然后对数组进行操作,这样就很好的解决了问题

3.高精度加法

加法只要要主要进位就可以了

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class 高精度加法 {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String A=br.readLine();
        String B=br.readLine();
        System.out.println(add(A,B));
    }


    static String add(String A,String B){
        int maxn=1000010;  //根据题目要求更改
        int[] a=new int[maxn];   //存放A
        int[] b=new int[maxn];   //存放B
        int[] c=new int[maxn];   //存放结果集
        int len1=A.length()-1;
        for (int i=0;i<A.length();i++) { //倒序放入数组
            a[i]=Integer.parseInt(A.substring(len1,len1+1));
            len1--;
        }

        int len2=B.length()-1;
        for (int i=0;i<B.length();i++) { //倒序放入数组
            b[i]=Integer.parseInt(B.substring(len2,len2+1));
            len2--;
        }
        int jin=0;//进位
        for (int i = 0; i <maxn ; i++) {
            int he=a[i]+b[i]+jin;
            c[i]=he%10;
            jin=he/10;
        }
        int index=0;
        for (int i = maxn-1; i >=0 ; i--) {
            if (c[i]!=0){
                index=i;
                break;
            }
        }
        String C="";
        for (int i = index; i >=0 ; i--) {
            C+=c[i];
        }
        return C;
    }
}

4.高精度减法

输入的两个数,要保证A>=B,如果是小于,就交换A,B,最后加上“ - ” 就可以了,需要注意借位

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class 高精度减法 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String A = br.readLine();
        String B = br.readLine();
        System.out.println(sub(A, B));
    }


    static String sub(String A, String B) {
        if (A.equals(B)){
            return "0";
        }
        int flag=0;  //标记是否要加负号
        int lena=A.length();
        int lenb=B.length();
        if (lena<lenb){   //说明A<B,交换A,B
            String temp=A;
            A=B;
            B=temp;
            flag=1;
        }

        if (lena==lenb){
            int count=0;

            while (count<lena){
                int aa=Integer.parseInt(A.charAt(count)+"");
                int bb=Integer.parseInt(B.charAt(count)+"");
                if (aa<bb){
                    flag=1;
                    String temp=A;
                    A=B;
                    B=temp;
                    break;
                }else if(aa>bb){
                    break;
                }
                count++;
            }

        }
        int maxn = 1000010;  //根据题目要求更改
        int[] a = new int[maxn];   //存放A
        int[] b = new int[maxn];   //存放B
        int[] c = new int[maxn];   //存放结果集
        int len1 = A.length() - 1;
        for (int i = 0; i < A.length(); i++) { //倒序放入数组
            a[i] = Integer.parseInt(A.substring(len1, len1 + 1));
            len1--;
        }

        int len2 = B.length() - 1;
        for (int i = 0; i < B.length(); i++) { //倒序放入数组
            b[i] = Integer.parseInt(B.substring(len2, len2 + 1));
            len2--;
        }
        for (int i = 0; i < maxn-1; i++) {
            int cha = 0;
            if (a[i] < b[i]) {
                cha = a[i] - b[i]  + 10;
                a[i + 1]--;  //借位处要减去1
            } else {
                cha = a[i] - b[i];
            }

            c[i] = cha;

        }
        int index = 0;
        for (int i = maxn - 1; i >= 0; i--) {
            if (c[i] != 0) {
                index = i;
                break;
            }
        }
        String C = "";
        for (int i = index; i >= 0; i--) {
            C += c[i];
        }
        if (flag==1){
            return "-"+C;
        }

        return C;
    }
}

5.高精度乘法

A*b 把A的值放入数组里,把b看作一个整体,进行相乘

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class 高精度乘法 {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String A=br.readLine();
        int b=Integer.parseInt(br.readLine());
        System.out.println(mul(A,b));

    }

    static String mul(String A,int b){
        int maxn=1000010;  //根据题目要求更改
        int[] a=new int[maxn];   //存放A
        int[] c=new int[maxn];   //存放结果集
        int len1=A.length()-1;
        for (int i=0;i<A.length();i++) { //倒序放入数组
            a[i]=Integer.parseInt(A.substring(len1,len1+1));
            len1--;
        }


        int jin=0;//进位
        for (int i = 0; i <maxn ; i++) {
            int ji=a[i]*b+jin;
            c[i]=ji%10;
            jin=ji/10;
        }
        int index=0;
        for (int i = maxn-1; i >=0 ; i--) {
            if (c[i]!=0){
                index=i;
                break;
            }
        }
        String C="";
        for (int i = index; i >=0 ; i--) {
            C+=c[i];
        }
        return C;
    }
}

6.高精度除法

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

public class 高精度除法 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String A = br.readLine();
        int b = Integer.parseInt(br.readLine());
        System.out.println(div(A, b));

    }


    static String div(String A, int b) {
        List<Integer> lista = new ArrayList<Integer>();
        for (int i = A.length() - 1; i >= 0; i--) {
            lista.add(Integer.parseInt(A.substring(i, i + 1)));
        }
        List<Integer> listc = new ArrayList<Integer>();
        int r=0;
        for (int i = lista.size()-1; i >=0 ; i--) {
            r=r*10+lista.get(i);
            listc.add(r/b);
            r%=b;
        }
        String C="";
        for (int i = 0; i <listc.size() ; i++) {
            String tem=listc.get(i)+"";
            C+=tem;
        }
        int index=0;
        while (C.charAt(index)=='0'){
            index++;
        }
        return C.substring(index);
    }
}
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值