算法例子:两个大数字符串相加(java)

1.算法例子

计算两个数字字符串相加.
例如:
s1 = “8763845638363774673957584937685934737”;
s2 = “763845638363774673957584937685934”;
计算s1与s2的和.

2.算法设计

在这里插入图片描述

1.将两个字符串转化成char数组 c1[],c2[].
2.定义个存储结果数组,result[];其长度为c1和c2数组长度的最大值+1,因为两个数相加,最大值为长度进一位.
3.逆向遍历char两个数组.
4.取出值两个值.n[i],n[j].result[max(i,j)]此时存储的是进位值.
4.1. temp=n[i]+n[j]+result[max(i,j)];
4.2.将个位:t1=temp%10; 十位:t2=temp/10;
将十位存储到result[max(i,j)],个位存储到result[max(i,j)+1].
5.最后再把未遍历的值.走一遍第步即可.(因为字符串长度可能不一致.)

3.算法结果

s1:8396
s2:93725
s1+s2=102121
s1:8763845638363774673957584937685934737
s2:763845638363774673957584937685934
s1+s2=8764609484002138448631542522623620671

4.算法实现

4.1.相加方法

/**
     * 合并两个大数据字符串
     *
     * @param numStr1 第一个数字字符串
     * @param numStr2 第二个数字字符串
     * @return 计算的结果
     */
    public static String bigNumAdd(String numStr1, String numStr2) {
        //1.将字符串转化成char数组
        int numStr1Len = numStr1.length();
        int numStr2Len = numStr2.length();
        char[] n1Array = numStr1.toCharArray();
        char[] n2Array = numStr2.toCharArray();
        //2.声明一个数组,长度为:两个数组的长度最大值+1.(因为任何两个数相加结果最大为大值进一位)
        int[] resultInt = new int[numStr1Len < numStr2Len ? numStr2Len + 1 : numStr1Len + 1];
        //3.逆向遍历两个数组
        int i, j, maxIndex;
        int temp, t1, t2;//t1存储个位,t2存储十位
        for (i = numStr1Len - 1, j = numStr2Len - 1; i >= 0 && j >= 0; i--, j--) {
            //3.1 temp=num1+num2+resultChar[maxIndex+1](因为)
            maxIndex = i > j ? i : j;
            temp = Integer.parseInt(String.valueOf(n1Array[i]))
                    + Integer.parseInt(String.valueOf(n2Array[j]))
                    + resultInt[maxIndex + 1];
            //3.2 如果temp小于10,那么将余数存储到对应位置即可
            //3.3 如果temp大于等于10,那么将余数存储到对应位置并且将是十位存储到个位位置的前一位.
            t1 = temp % 10;
            t2 = temp / 10;
            resultInt[maxIndex + 1] = t1;
            resultInt[maxIndex] = t2;
        }
        //4.遍历剩下未遍历的,计算添加到对应的resultInt位置即可
        if (i >= 0) {
            for (; i >= 0; i--) {
                temp = Integer.parseInt(String.valueOf(n1Array[i])) + resultInt[i + 1];
                t1 = temp % 10;
                t2 = temp / 10;
                resultInt[i + 1] = t1;
                resultInt[i] = t2;
            }
        }
        if (j >= 0) {
            for (; j >= 0; j--) {
                temp = Integer.parseInt(String.valueOf(n2Array[j])) + resultInt[j + 1];
                t1 = temp % 10;
                t2 = temp / 10;
                resultInt[j + 1] = t1;
                resultInt[j] = t2;
            }
        }
        //5.resultInt的值就是最后所求的结果, 将resultInt转化成字符串即可.
        int size = resultInt.length;
        StringBuilder sb = new StringBuilder();
        for (i = 0; i < size; i++) {
            //表示第一位是0,那么就是未进行进位,不需要添加到字符串中.
            //后面的都需要拼接到字符串
            if (i == 0 && resultInt[i] == 0) {
                continue;
            }
            sb.append(resultInt[i]);
        }
        return sb.toString();
    }

4.2.调用示例

public static void main(String[] args) {
        String s1 = "8396";
        String s2 = "93725";
        String result = bigNumAdd(s1, s2);
        System.out.println("s1:" + s1);
        System.out.println("s2:" + s2);
        System.out.println("s1+s2=" + result);

        s1 = "8763845638363774673957584937685934737";
        s2 = "763845638363774673957584937685934";
        result = bigNumAdd(s1, s2);
        System.out.println("s1:" + s1);
        System.out.println("s2:" + s2);
        System.out.println("s1+s2=" + result);

    }

如果有好的实现方法,还请大家提出来,共同学习.

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值