1.思路
大数加法主要是模拟手写的加法,我们手写加法时会从个位加上进位一位一位的运算一直加到最高位,就能计算出结果。
2.代码模板
注意这里的a,b以及要返回的c都是倒序存储的,也就是说第一位是个位,最后一位才是最高位,这就相当于模拟我们手动写加法
import java.util.*;
class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String a = in.next();
String b = in.next();
List<Integer> a1 = new ArrayList<>();
List<Integer> b1 = new ArrayList<>();
for(int i = 0; i < a.length(); i++)
a1.add(a.charAt(i) - '0');
for(int i = 0; i < b.length(); i++)
b1.add(b.charAt(i) - '0');
List<Integer> c = add(a1 , b1);
for(int i = c.size() - 1; i >= 0; i--)
System.out.print(c.get(i));
System.out.println();
in.close();
}
//a,b为要相加的大数,返回a+b的结果
//注意这里的a,b以及要返回的c都是倒序存储的,也就是说第一位是个位,最后一位才是最高位,这就相当于模拟我们手动写加法
public static List<Integer> add(List<Integer> a, List<Integer> b) {
List<Integer> c = new ArrayList<>(); //保存a+b的结果
int t = 0, i = 0, j = 0; //t代表进位,i代表当前a已经计算了多少位, j代表当前b已经计算了多少位
while(i < a.size() || j < b.size() || t != 0) { //如果a或b没计算完,并且还有进位没计算完
if(i < a.size())
t += a.get(i++);
if(j < b.size())
t += b.get(j++);
c.add(t % 10); //保留t的个位,当作前一位计算出的结果
t /= 10; //保留进位
}
return c; //返回答案,记住这里c是倒叙存储的
}
}
来一个正序存储版,最后一位为个位,第一位为最高位
import java.util.*;
class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String a = in.next();
String b = in.next();
List<Integer> a1 = new ArrayList<>();
List<Integer> b1 = new ArrayList<>();
for(int i = 0; i < a.length(); i++)
a1.add(a.charAt(i) - '0');
for(int i = 0; i < b.length(); i++)
b1.add(b.charAt(i) - '0');
List<Integer> c = add(a1 , b1);
for(int i = 0; i < c.size(); i++)
System.out.print(c.get(i));
System.out.println();
in.close();
}
public static List<Integer> add(List<Integer> a, List<Integer> b) {
List<Integer> c = new ArrayList<>(); //保存a+b的结果
int t = 0, i = a.size() - 1, j = b.size() - 1;//从个位(最后一位)开始计算
while(i >= 0 || j >= 0 || t != 0) {
if(i >= 0)
t += a.get(i--);
if(j >= 0)
t += b.get(j--);
c.add(t % 10);
t /= 10;
}
Collections.reverse(c); //因为c是倒序存储,所以用集合工具类反转
return c; //返回正序存储的答案
}
}
再来一个Java语言的大数
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
String[] s = cin.readLine().split(" ");
BigInteger n = new BigInteger(s[0]);
s = cin.readLine().split(" ");
BigInteger m = new BigInteger(s[0]);
System.out.println(m.add(n));
}
}
3.复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
4.注意
在面试中尽量不要用语言的特性(比如Java大数)来回答面试官问题,面试官是想考你的思维,而不是考你这些语言的特性。