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

    
    
  • 相关阅读:
    Android中Activity之间通信
    vs2017 2019 下载更新慢的解决方法
    c# 判断某个类是否实现某个接口
    mvc api 关于 post 跟get 请求的一些想法[FromUri] 跟[FromBody] 同一个控制器如何实现共存
    vs2017 mvc 自定义路由规则 出现 404.0 错误代码 0x80070002
    C# winform 发布的时候没有app.config去哪儿了?
    安装c#服务
    Type.GetType反射的对象创建Activator.CreateInstance
    c# 谷歌动态口令对接
    asp.net mvc 异步控制器
  • 原文地址:https://www.cnblogs.com/WakingShaw/p/13568616.html
Copyright © 2011-2022 走看看