侧边栏壁纸
博主头像
牧云

怀璧慎显,博识谨言。

  • 累计撰写 212 篇文章
  • 累计创建 20 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

算法题:两个字符串数字相加

秋之牧云
2026-07-08 / 0 评论 / 0 点赞 / 1 阅读 / 0 字
private static String add(String str1, String str2) {
    //任何一个字符串为null或空字符串,都不需要相加了
    if (str1 == null || str1.isEmpty()) {
        return str2;
    }
    if (str2 == null || str2.isEmpty()) {
        return str1;
    }
    int maxLength = Math.max(str1.length(), str2.length());
    //定义一个存贮结果的字符串,长度要比最大长度字符串还长一位,用于存储可能出现的进位
    StringBuilder result = new StringBuilder(maxLength + 1);

    //翻转两个字符串
    str1 = new StringBuffer(str1).reverse().toString();
    str2 = new StringBuffer(str2).reverse().toString();

    //反转后的结果分别为:
    //954321
    //321
    int minLength = Math.min(str1.length(), str2.length());
    //进位
    int carry = 0;
    //当前位上的数值
    int currentNum = 0;
    //循环变量
    int i = 0;
    while (i < minLength) {
        //分别获取两个字符对应的字面数值,然后相加,再加上进位
        currentNum = str1.charAt(i) + str2.charAt(i) - 2 * '0' + carry;
        //获取进位
        carry = currentNum / 10;
        //处理当前位的最终值
        currentNum %= 10;
        //保存当前位的值到最终的字符缓冲区中
        result.append(currentNum);
        i++;
    }
    String longStr = str1.length() > str2.length() ? str1 : str2;
    // 处理进位从上次i开始
    while (i < longStr.length()) {
        //分别获取两个字符对应的字面数值,然后相加,再加上进位
        currentNum = str1.charAt(i) - '0' + carry;
        //获取进位
        carry = currentNum / 10;
        //处理当前位的最终值
        currentNum %= 10;
        //保存当前位的值到最终的字符缓冲区中
        result.append(currentNum);
        i++;
    }
    //处理最后一个的进位(当循环结束后,是不是还可能会有一个进位)
    if (carry > 0) {
        result.append(carry);
    }
    //最后翻转恢复字符串,再返回
    return result.reverse().toString();
}

0

评论区