大数相加

题目 #

给定两个整数 a, b, 要求你计算 a + b 的值。注意 a, b 的数值范围非常大!

输入描述

第一行输入一个数字 a (1 ≤ a ≤ 101000) 第二行输入一个数字 b (1 ≤ b ≤ 101000)

输出描述

输出一个整数, 表示 a + b 的值。

样例

输入

1 1

输出

2

解答 #

使用BigDecimal #

import java.io.*;
import java.math.BigDecimal;
import java.util.*;

public class AddBigNum {
    public static void main(String[] args) throws IOException{
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out=new PrintWriter(System.out);
        String a=in.readLine();
        String b=in.readLine();
        BigDecimal bigA=new BigDecimal(a);
        BigDecimal bigB=new BigDecimal(b);
        out.print(bigA.add(bigB));
        out.flush();
    }
}

使用字符串模拟大数相加 #

import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out=new PrintWriter(System.out);
        String a=in.readLine();
        String b=in.readLine();
        char[] aArr=a.toCharArray();
        char[] bArr=b.toCharArray();
        int lenA=aArr.length;
        int lenB=bArr.length;
        // 默认A是大的
        if(lenA<lenB){
            char[] temp=aArr;
            aArr=bArr;
            bArr=temp;
            int tempVal=lenA;
            lenA=lenB;
            lenB=tempVal;
        }
        // char[] res=new char[lenA];
        int carry=0;
        int index=lenA-1;
        for(int i=lenB-1;i>=0;i--){
            int val=(aArr[index]-'0')+(bArr[i]-'0')+carry;
            aArr[index]=(char)('0'+(val%10));
            if(val>=10){
                // val=val%10;
                carry=val/10;
            }else{
                carry=0;
            }
            index--;
        }
        for(int i=index;i>=0;i--){
            int val=(aArr[index]-'0')+carry;
            aArr[index]=(char)('0'+(val%10));
            if(val>=10){
                carry=val/10;
            }else{
                carry=0;
            }
        }
        if(carry>0){
            out.println(carry+new String(aArr));
        }else{
            out.println(new String(aArr));
        }
        out.flush();
    }
}

这个循环有点复杂了,可以简化一下:

import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out=new PrintWriter(System.out);
        String aStr=in.readLine();
        String bStr=in.readLine();
        char[] aArr=aStr.toCharArray();
        char[] bArr=bStr.toCharArray();
        int lenA=aArr.length;
        int lenB=bArr.length;
        int carry=0;
        int i=lenA-1;
        int j=lenB-1;
        char[] res=new char[lenA>lenB?lenA+1:lenB+1];
        int index=res.length-1;
        while(i>=0||j>=0||carry>0){
            int a=(i>=0)?aArr[i]-'0':0;
            int b=(j>=0)?bArr[j]-'0':0;
            int val=a+b+carry;
            res[index--]=(char)('0'+val%10);
            carry=val/10;
            i--;
            j--;
        }
        String ans = new String(res, index + 1, res.length - index - 1);
        // out.println(ans);
        out.println(ans);
        out.flush();
    }
}

最好的方式是使用StringBuilder来构建字符串,这样可以避免字符数组的转换问题,并且不需要处理前导零的问题:

import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out=new PrintWriter(System.out);
        String aStr=in.readLine();
        String bStr=in.readLine();
        char[] aArr=aStr.toCharArray();
        char[] bArr=bStr.toCharArray();
        int lenA=aArr.length;
        int lenB=bArr.length;
        int carry=0;
        int i=lenA-1;
        int j=lenB-1;
        // char[] res=new char[lenA>lenB?lenA+1:lenB+1];
        StringBuilder sb=new StringBuilder();
        // int index=res.length-1;
        while(i>=0||j>=0||carry>0){
            int a=(i>=0)?aArr[i]-'0':0;
            int b=(j>=0)?bArr[j]-'0':0;
            int val=a+b+carry;
            sb.append(val%10);
            carry=val/10;
            i--;
            j--;
        }
        // String ans = new String(res, index + 1, res.length - index - 1);
        // out.println(ans);
        out.println(sb.reverse().toString());
        out.flush();
    }
}