算法 | 两大数相加(java实现)

算法关键:

  1. 如何巧妙获取一个字符数字对应的ASCII码:利用其相对字符’0’的偏移量
  2. 巧妙地设计算法退出条件:两输入的字符串都要被扫描完,且,不再有需要处理的进位
  3. 其他处理:每次求个位数用的是模除取余(%);每次求是否需要进位用的是除法取商(/)
  4. 注意事项:获取结果注意下是否需要reverse反转
  5. 如何巧妙地将不足位的值赋默认值0?这个条件刚开始写的时候我想不出来,因为我总想通过两个字段长度比对得出哪个字段更短再处理。然而答案很巧妙:因为我们只需要将较短的字符串的空缺值补上、且、循环次数不会超过较长字符串的最大值,所以对于这两个字符串:都可以进行形如 int a = aLength < 0 ? 0 : str_1.charAt(aLength–); 的操作
package com.example.algorithm;

/**
 * 两大数相加
 */
public class TestAdd {

    /**
     * 算法退出条件:两个数都扫描完毕,且无进位需处理
     * 计算逻辑:将字符转成数字,利用charAt和'0'的相对值 48-'0' 49-'1'
     * @param args
     */
    public static void main(String[] args) {

        String str_1 = "31434";
        String str_2 = "171436";

        String sum = mockAdd(str_1, str_2);
        System.out.println(sum);
        System.out.println(31434 + 171436);
        
    }

    private static String mockAdd(String str_1, String str_2) {

        int flag = 0;
        if(null == str_1 || "".equals(str_1) || null == str_2 || "".equals(str_2) ) {
            return "";
        }

        StringBuilder str = new StringBuilder();
        int aLength = str_1.length()-1;
        int bLength = str_2.length()-1;

        while(aLength >= 0 || bLength >= 0 || flag!=0) {
            int a = aLength < 0 ? 0 : str_1.charAt(aLength--) - '0'; // 当时想不到怎么比较哪个字符串更长: 现在想来不用考虑,因为即使都加了小于0的判断也不会有问题
            
            int b = bLength < 0 ? 0 : str_2.charAt(bLength--) - '0';
            int num = (a + b + flag) % 10;
            flag = (a + b) / 10;
            str.append(num);
        }
        return str.reverse().toString();
    }
}

你可能感兴趣的:(data,structure,java,算法,两大数相加)