牛客题目:实现超长正整数相加

题目描述
请设计一个算法完成两个超长正整数的加法。
输入描述:
输入两个字符串数字
输出描述:
输出相加后的结果,string型

算法思想

  1. 用两个字符数组分别逆序存储两个字符串所表示的整数;
  2. 遍历前面两个数组,按位相加, 用比前面两个字符数组中最大的字符数组还大一点的数组保存结果,多出来的一位保存是否进位;
  3. 如果结果数组的最后一个元素为1,则表示有进位,把数组逆序转为String;若为0,则表示无进位,从倒数第二个元素开始逆序存储为String

Java代码

import java.util.*;
public class Main{
  public static String AddLongInteger(String addend, String augend)
    {
        //逆序存储两个字符串所表示的整数
        char[] ch1 = new StringBuilder(addend).reverse().toString().toCharArray();
        char[] ch2 = new StringBuilder(augend).reverse().toString().toCharArray();
        int length = ch1.length > ch2.length ? ch1.length + 1 : ch2.length + 1;
        //用一个稍微大一点的数组来保存结果
        int[] ret = new int[length];
        //遍历数组,按位相加
        for(int i = 0; i < length; i++){
            int tmp = ret[i];
            if(i < ch1.length){
                tmp += ch1[i] - '0';
            }
            if(i < ch2.length){
                tmp += ch2[i] - '0';
            }
            //判断进位
            if(tmp > 9){
                tmp -= 10;
                ret[i + 1] = 1;
            }
            ret[i] = tmp;
        }
        //结果数组逆序转为String
        StringBuilder sb = new StringBuilder();
        //判断有无进位
        int head = length - 1;
        if(ret[length - 1] == 0){
            head = ret.length - 2;
        }
        for(int i = head; i >= 0; i--){
            sb.append(ret[i]);
        }
        return sb.toString();
    }
  public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str1 = sc.next();
            String str2 = sc.next();
            System.out.println(AddLongInteger(str1, str2));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43452252/article/details/105483008
今日推荐