求两个大数之和

编程实现大数的加法。

比如说,给出两个数a,b,它们各自的位数都大于1000(用String来表示)。这时候,我们发现,用任何一种数据类型都不足以表示这两个数,更别说表示这两个数之和了。因此,我们可以用换一种方式,通过两个数组来分别表示这两个数,然后把两个数组对应位置的元素各自相加,则可求得两个数之和。

这样处理的难点在于对齐。我们知道,加法是从低位开始相加的,转换成数组的话,如果是正常处理,则可能需要在较小数的前面补0,处理起来略微麻烦,因此我们可以通过翻转这个数,把高位放在数组的后面,这样就不需要另外去补0了。

另外一个难点是进位。我的想法是,在求出各个位置相加的和之后,再作处理。如果当前位置上的元素>9,则需要向后进位(因为此时数已经被翻转了)。

实现代码如下:

public class Main {
    public static void main(String[] args) {
        
        String a = null;
        String b = null;
        Scanner sc = new Scanner(System.in);
        a = sc.nextLine();
        b = sc.nextLine();
        System.out.println(getRes(a, b));
    }

  public static String getRes(String a, String b) {
    char[] large = null;
    char[] small = null;
    if(a.length() > b.length()) {
      large = a.toCharArray();
      small = b.toCharArray();
    }else {
      large = b.toCharArray();
      small = a.toCharArray();
    }
    int len = large.length;
    int[] sum = new int[len];
    //把这个数倒过来,处理起来比较方便
    for(int i = 0; i < len; i++) {
      sum[i] = large[len-1-i] - '0';
    }
    for(int j = 0; j < small.length; j++) {
      sum[j] += (small[small.length-1-j] - '0');
    }
    //进位,当sum数组上的元素大于9时,则说明这个位置需要向前进位,但是由于我们前面把数倒过来,所以在这里是向后进位
    for(int k = 0; k < len - 1; k++) {
      if(sum[k] > 9) {
        sum[k+1] += sum[k]/10;
        sum[k] = sum[k] % 10;
      }
    }
    StringBuilder sb = new StringBuilder();
    //把数组元素翻转,则可求得需要的结果
    for(int k = len-1; k >= 0; k--) {
      sb.append(sum[k]);
    }
    String res = sb.toString();
    //细节处理,如果该字符串的首位为0,则证明没有进位,应该把0给去掉
    if(res.charAt(0) == '0') {
      res = res.substring(1);
    }
    return res;
  }
}


原文地址:https://www.cnblogs.com/WakingShaw/p/13568616.html