CS-Wiki CS-Wiki
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
  • 刷题模板汇总
  • 一些刷题小技巧
  • 整数 and 位运算

  • 数组

  • 链表

  • 哈希表

  • 字符串

  • 栈

  • 队列

  • 二叉树

  • 前缀树

  • 二分查找

  • 双指针法

    • 双指针法理论基础
    • 左右指针

    • 滑动窗口

    • 快慢指针

    • 其他

      • 合并两个有序链表
      • 合并两个有序数组
      • 两数相加
      • 链表中的两数相加
      • 字符串相加
      • 大数相减
      • 比较版本号
      • 寻找两个正序数组的中位数
      • 奇偶链表
      • 剑指Offer.替换空格
  • 区间求和问题

  • 排序

  • 回溯算法

  • 贪心算法

  • 动态规划

  • 图

  • 数学

  • 自动机

  • 海量数据和空间限制

  • 05-数据结构与算法
  • 双指针法
  • 其他
小牛肉
2022-10-10

大数相减

和大数相加差不多,需要注意两点:

  • 先要注意判断,大数减小数正常相减,小数减大数相当于大数减小数前添加个负号
  • 也是从后向前相减,个位开始相减,相减时先加个 10
  • 最后注意去掉结果开头的 0
public class Huawei {

    public static void main(String[] args) {
        String num1 = "2000";
        String num2 = "1001";

        System.out.println(func(num1, num2));
    }

    private static String func(String num1, String num2) {
        char[] c1 = num1.toCharArray();
        char[] c2 = num2.toCharArray();

        int len1 = c1.length;
        int len2 = c2.length;

        if (len1 > len2) {
            return sub(c1, c2);
        }
        else if (len1 < len2) {
            return "-" + sub(c2, c1);
        }
        else {
            int compare = num1.compareTo(num2);
            if (compare == 0) {
                return "0";
            }
            else if (compare > 0) {
                return sub(c1, c2);
            }
            else {
                return "-" + sub(c2, c1);
            }
        }

    }

    private static String sub(char[] c1, char[] c2) {
        StringBuilder res = new StringBuilder();

        int len1 = c1.length;
        int len2 = c2.length;

        // 借位
        int carry = 0;

        for (int i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0; i --, j --) {
            int a = (i >= 0 ? c1[i] - '0' : 0) + carry;
            int b = j >= 0 ? c2[j] - '0' : 0;

            int temp = 0;

            if (a < b) {
                // 借位
                carry = -1;
                temp = a + 10 - b;
            }
            else {
                carry = 0;
                temp = a - b;
            }

            res.append(temp);
        }
		
        // 去掉开头的 0
        if (res.charAt(res.length() - 1) == '0') {
            res.deleteCharAt(res.length() - 1);
        }

        return res.reverse().toString();
    }
}

🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~

帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10
字符串相加
比较版本号

← 字符串相加 比较版本号→

最近更新
01
02
线上环境 CPU 使用率飙升如何快速排查?
03-05
03
面试官再跟你说中国没有根服务器,雪人计划让他了解下
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2023 飞天小牛肉 | 皖ICP备2022008966号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式