题目 #
给定两个整数 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();
}
}