欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-21 17:37:32
...

1.算法例子

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

2.算法设计

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

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);

    }

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