JAVA实现:用字符串实现两个超大整数相加

本文介绍了一种使用字符串来实现两个超大整数相加的方法,通过逐位相加并处理进位,避免了传统整型数据类型可能引起的溢出问题。文章详细解释了算法步骤,并提供了完整的Java代码实现。

用字符串实现两个超大整数相加:

直接上代码:

package study;

public class test01 {

    public static void main(String[] args){
        String str1 = "1234569";
        String str2 = "123";
        System.out.println(add(str1, str2));
        System.out.println("Program End:");
    }

    private static String add(String str1, String str2){
        // 任何一个字符串为null或者空字符串,都不需要相加了
        if(str1==null||"".equals(str1)){
            return str2;
        }
        if(str2==null||"".equals(str2)){
            return str1;
        }
        int maxLength = Math.max(str1.length(), str2.length());
        // 定义一个存储结果的字符串,长度要比最大长度字符串还长一位,
        // 用于存储可能出现的进位
        StringBuffer result = new StringBuffer(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;
        for (;i<minLength;i++){
            // 分别获取两个字符对应的字面数值,然后相加,再加上进位
            currentNum = str1.charAt(i) + str2.charAt(i) - 2*'0' + carry;
            // 获取进位
            carry = currentNum/10;
            // 处理当前位的最终值
            currentNum%=10;
            // 保存当前位的值到最终字符缓冲区中
            result.append(String.valueOf(currentNum));
        }
        if(str1.length()<str2.length()){
            // str1 = str2;
        }
        for (;i<str1.length();i++){
            // 分别获取两个字符对应的字面数值,然后相加,再加上进位
            currentNum = str1.charAt(i) - '0'+carry;
            // 获取进位
            carry = currentNum/10;
            // 处理当前位的最终值
            currentNum%=10;
            // 保存当前位的值到最终的字符缓冲区中
            result.append(String.valueOf(currentNum));
        }
        // 处理最后一个进位
        if(carry>0){
            result.append((String.valueOf(carry)));
        }
        //最后翻转恢复字符串,再返回
        return result.reverse().toString();
    }
}

问题:

2*'0' 啥意思 为什么要这么做?

'2'的ASCII码是50,
'1'的ASCII码是49,
'0'的ASCII码是48,
'2' + '1' - 2* '0' = 3

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kerven_HKW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值