基础练习 高精度加法

基础练习 高精度加法

时间限制:1.0s 内存限制:512.0MB

问题描述
  输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
算法描述
  由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
  定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
  计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
  最后将C输出即可。
输入格式
  输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
  输出一行,表示a + b的值。
样例输入
20100122201001221234567890
2010012220100122
样例输出
20100122203011233454668012


实现代码

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    static Scanner s = new Scanner(System.in);

    public static void main(String[] args) {
        String strA, strB = new String(); // 声明2个String对象来装在2个加数a,b
        strA = s.nextLine();
        strB = s.nextLine();
        int[] A = new int[strA.length()]; // 定义个A数组
        int[] B = new int[strB.length()]; // 定义个B数组
        // 根据题目意思,A[0]装a的个位,A[1]装a的十位……所以需要将字符串进行反转(因为个位在字符串末尾)
        for (int i = 0; i < strA.length(); i++) {
            A[strA.length() - 1 - i] = (strA.charAt(i) - 48); // 减48,将ASCII码转换为数字
        }
        for (int i = 0; i < strB.length(); i++) {
            B[B.length - 1 - i] = (strB.charAt(i) - 48); // 减48,将ASCII码转换为数字
        }
        // 下面就应该进行加法运算了 ,对于结果C的长度,应该是2个加数的最大位数+1。
        int maxLen = A.length > B.length ? A.length : B.length;
        int[] C = new int[maxLen + 1];

        // minLen用来规定2个数的加法次数
        int minLen = A.length < B.length ? A.length : B.length;

        int r = 0; // 用来保留整数部分
        for (int i = 0; i < minLen; i++) {
            int temp = A[i] + B[i] + r; // 进行加法
            r = temp / 10; // r用来保留进位
            C[i] = temp % 10; // C中只保留一位数字
        }
        if (A.length > B.length) { // 如果A的位数比B的多,则把A的数字放入C里面
            for (int i = B.length; i < maxLen; i++) { // 从B.length开始操作
                int temp = A[i] + r;
                r = temp / 10;
                C[i] = temp % 10;
            }
        } else if (A.length < B.length) {
            for (int i = A.length; i < maxLen; i++) { // 从A.length开始操作
                int temp = B[i] + r;
                r = temp / 10;
                C[i] = temp % 10;
            }
        }
        if (r != 0) { // 如果r还有值的话,就将r加在最高位上
            C[C.length - 1] += r;
        }
        // 判断一下最高位是否为0,如果为0则把这个0给去掉
        if (C[C.length - 1] == 0) {
            C = Arrays.copyOfRange(C, 0, C.length - 1);
        }
        for (int i = 0; i < C.length; i++) {
            System.out.print(C[C.length - 1 - i]);
        }
    }

}

算法思路

  1. 首先需要充分读懂题目的意思,以及题目给的提示。
  2. 需要接收2串数字,因为不确定输入数字串的长度,所以,这个我考虑用String对象来接收,然后再放入int数组中。
  3. 根据输入2串数字中的位数,可以计算出和的长度为在此基础上+1。如:1个5位数和1个6位数相加,和顶多是7位数。
  4. 不管加数a或者加数b各有几位,我先把他们的最小位数求出来,然后让2个数进行加法运算,在加法运算之前应该先定义一个变量r存放进位,然后让变量temp来做A[i] + B[i] + r的操作,再让r = temp /10; C[i]=temp % 10;即C[i]中只保存一位数字,进位数字放入r中。
  5. 在执行完第四步操作之后,判断a或b是否有还未被处理的数字,如果有,则执行和第四步类似的操作。
  6. 最后对C数组进行一点处理,如果C的最高位没有进位(如:99+99,那么C的长度是3,然后C的最高位是1,存的数是198。但是如果是33+33,那么C的长度也是3,然后C的最高位是0),即为0,就需要把这个0给去掉,然后再输出,否则,直接输出。(因为C[0]存放的是个位数字,所以最高位数字存放在C[C.length-1]中)。
    注:本程序原理不是很难,所以加的注释不算多,本人一向相信一个观念——不加注释的程序,不是一个好的程序。如果大伙有好的想法,可以留言和我一起交流。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值