微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【算法】高精度减法Java

介绍

高精度减法:实现两个大整数相减,代码实现过程类似于纸上进行减法运算

实现思路

将两个整数按位存储到列表中,设置一个 t 进行借位标识,同时在运算之前要进行大小比较

举例

【题目描述】
给定两个正整数(不含先导0),计算它们的差,计算结果可能为负数
【输入格式】
共两行,每行包含一个整数
输出格式】
共一行,表示所求的差
【数据范围】
1 ≤ 整数长度 ≤ 1e5

代码实现

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String b = sc.next();
        List<Integer> A = new ArrayList<>();
        List<Integer> B = new ArrayList<>();
        //按位倒序存储,方便进行减法运算,并且存储时将字符转换为数字
        for(int i = a.length() - 1; i >= 0; i --)  A.add(a.charat(i)-'0');
        for(int i = b.length() - 1; i >= 0; i --)  B.add(b.charat(i)-'0');
        if(cmp(A, B)){
            List<Integer> C = sub(A, B);
            for(int i = C.size() - 1; i >= 0; i --){System.out.print(C.get(i));}
        }else{
            List<Integer> C = sub(B, A);
            System.out.print("-");//如果为负数,先输出负号
            for(int i = C.size() - 1; i >= 0; i --){System.out.print(C.get(i));}
        }
    }
    
    //按位比较两个大整数的大小
    public static boolean cmp(List<Integer> A, List<Integer> B){
    	//如果位数不同,直接返回位数的比较结果
        if(A.size() != B.size()) return A.size() > B.size();
        else{
        	//如果位数相同,从高位开始循环,直到两者不同,返回两者比较的结果
            for(int i = A.size() - 1; i >= 0; i --){
                if(A.get(i) != B.get(i)){
                    return A.get(i) > B.get(i);
                }
            }
        }
        return true;
    }
    
    public static List<Integer> sub(List<Integer> A, List<Integer> B){
        List<Integer> C = new ArrayList<>();
        for(int i = 0, t = 0; i < A.size(); i ++){
        	//应该为 t = A.get(i) - B.get(i)- t,但需要判断B是否存在该位
            t = A.get(i) - t;
            if(i < B.size()) t -= B.get(i);
            //若存在不够减的情况,t为负数,则存储时应借十取余
            C.add((t + 10) % 10);
            //如果t < 0,说明不够减,则应让表示借位的t为1
            if(t < 0) t = 1;
            else t = 0;
        }
        //注意可能存在高位相同,相减后导致存在高位为0的情况
        while(C.size() > 1 && C.get(C.size() - 1) == 0) C.remove(C.size() - 1);
        return C;
    }
}

原文地址:https://www.jb51.cc/wenti/3280119.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐