【大数问题】字符串相减(大数相减)<模拟>

类似 【力扣】415. 字符串相加(大数相加),实现大数相减。

题解

模拟相减的过程,先一直使大数减小数,记录借位,最后再判断是否加负号。(中间需要删除前导0,例如10001-10000=00001)

java 复制代码
import java.util.*;

public class BigNumSub {
    public static String subStrings(String num1, String num2) {
        // 默认 num1 大于 num2
        boolean flag = true;
        // num1 比 num2 小
        if (num1.length() < num2.length()) {
            String tempString = num1;
            num1 = num2;
            num2 = tempString;
            flag = false;
        } else if (num1.length() == num2.length() && num1.compareTo(num2) < 0) {
            String tempString = num1;
            num1 = num2;
            num2 = tempString;
            flag = false;
        }

        // 两个指针分别指向数字的末尾
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        //  borrow 维护当前是否有借位
        int borrow = 0;

        StringBuffer ans = new StringBuffer();
        // 减完
        while (i >= 0 || j >= 0) {
            int x = i >= 0 ? num1.charAt(i) - '0' : 0;
            int y = j >= 0 ? num2.charAt(j) - '0' : 0;

            // 当前的和
            int result = x - y - borrow + 10;
            // 最后的结果加上这个位的数字
            ans.append(result % 10);
            // 更新下一个借位
            borrow = x - y - borrow < 0 ? 1 : 0;
            i--;
            j--;
        }

        //删除前导0
        int pos;
        for (pos = ans.length() - 1; pos > 0 ; pos--) {
            if (ans.charAt(pos) != '0')
                break;
        }
        ans.delete(pos+1, ans.length()); //如果start等于end,则不进行任何更改

        if(!flag){
            ans.append("-");
        }
        // 计算完以后的答案需要翻转过来
        ans.reverse();
        return ans.toString();
    }


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String num1 = in.next();
        String num2 = in.next();
        String resultString = subStrings(num1, num2);
        System.out.println(resultString);
    }
}
相关推荐
爱学习的小白柏2 分钟前
【AI问数技术】多Agent协同架构:查询规划/SQL生成/洞察分析/报告生成
java·网络·人工智能·windows·sql·架构·llama
艾伦_耶格宇8 分钟前
【AI】-4 OpenCode Go 接入 Obsidian 完整指南
运维·开发语言·人工智能·agent·opencode
码匠许师傅13 分钟前
【C++ 面试真题】30. 聊聊 C++ 的互斥锁与读写锁
java·c++·面试
沙盘客18 分钟前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享
旋生万物32 分钟前
【终极实战】用Python从零“生成“一个宇宙:螺旋干涉模型的代码实现
开发语言·前端·人工智能·react.js·php·wpf
CHANCE V1 小时前
集合排序和流排序
java
16月6日-晴1 小时前
Java面向对象进阶—多态
java·开发语言
冯汉栩2 小时前
Swift Control RollingCountdownView(动画倒计时)
开发语言·ios·swift
lisanmengmeng2 小时前
搭建elk环境并接入frostmourne,实现监控报警效果(五)
开发语言·elk·日志·日志监控
qq_185198692 小时前
SpringBoot-五-AOT
java·spring boot·后端