zoukankan      html  css  js  c++  java
  • 求两个大数之和

    编程实现大数的加法。

    比如说,给出两个数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;
      }
    }

    
    
  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 最大的元素距离
    Java 第十一届 蓝桥杯 省模拟赛 递增序列
    Java 第十一届 蓝桥杯 省模拟赛 递增序列
    Java 第十一届 蓝桥杯 省模拟赛 最大的元素距离
  • 原文地址:https://www.cnblogs.com/WakingShaw/p/13568616.html
Copyright © 2011-2022 走看看