算法刚刚入门,每次记录下自己所学的知识总结以及理解,希望能够帮助大家,如有内容有错误或可改进的地方,欢迎一起探讨,一起进步,在此也要感谢WYSCODER学长给我的学习建议
目录
大整数:超过了long类型,已经不能直接相加了,会造成数据溢出
方法一:
就像我们小学学的加法,按位相加,那我们用代码怎么实现呢
思路:
/*
思路:
先开两个整型数组,其长度为两个大数的位数最大的那个+1,分别存两个大数(倒序存入),为了方便在遍历结果数组中进行两个大数的从后往前相加
再开一个整型数组,用来存放两个大数相加的和,其长度也是两个大数的位数最大的那个+1,
原因:
进位+1,例如:12+99,那我们就应该开一个三位的整型数组来存放
为什么关于两个大数开的数组长度也为位数最大+1?
原因:
因为后面在遍历结果数组中,要将两个大数的每一位进行相加,如果不统一数组长度,会造成数组越界
遍历结果数组,将大数a与大数b对应索引值的值进行相加,开一个变量temp进行保存,并判断temp是否>=10,如果满足则要进行进位,那下一位的temp值保存为1,本位则要-10
*/
代码:
//努力学习Java
package 大整数相加问题;
import java.io.*;
import java.util.Scanner;
public class 大整数相加基础 {
static StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static Scanner scanner = new Scanner(System.in);
public static StringBuilder getBigNumSum(String bigNum1,String bigNum2){
int max_length = Math.max(bigNum1.length(), bigNum2.length());
/*
找最大长度两种方法:
1.利用三目运算符
int max_length = bigNum1.length()>bigNum2.length()?bigNum1.length():bigNum2.length();
2.利用Math工具类
int max_length = Math.max(bigNum1.length(),bigNum2.length());
*/
/*
将两个大数分别存放到数组中
*/
int[] arr1 = new int[max_length+1];
for (int i = 0; i < bigNum1.length(); i++) {
arr1[i] = bigNum1.charAt(bigNum1.length()-1-i)-'0';
/*
想一下:为什么会有-‘0’这步操作
因为我们取的bigNum1.charAt(bigNum1.length()-1-i))其实是ASCII值
例如:num = 123313213
我们要想取第二位2
如果只写num.charAt(1),那么得到的结果并非2,而是它对应的ASCII值,也就是50,
那么我们要想结果为2,就要减去0的ASCII的值,(ASCII是对应着十进制的数字,因此是连续着的)那么我们就知道0对应的ASCII值就是48,因此十进制下的2-0,就等于‘2‘-’0’,
结果就是我们想要的了,这样的思想在进制转换也会涉及到
*/
}
int[] arr2 = new int[max_length+1];
for (int i = 0; i < bigNum2.length(); i++) {
arr2[i] = bigNum2.charAt(bigNum2.length()-1-i)-'0';
}
int[] res_arr = new int[max_length+1];
for (int i = 0; i < res_arr.length; i++) {
int temp = res_arr[i];
temp += arr1[i];
temp += arr2[i];
/*
判断是否>=10,大于10,本位-10,下位的先保存1
*/
if (temp>=10){
temp -= 10;
res_arr[i+1] = 1;
}
res_arr[i] = temp;
}
/*
创建StringBuilder类的对象res,如果返回值类型为String,则要进行转换
res.toString();
也可以使用String创建
*/
StringBuilder res = new StringBuilder();
boolean f = false;
for (int i = res_arr.length-1; i >= 0; i--) {
if (!f){
if (res_arr[i]==0){
continue;
}
f = true;
}
res.append(res_arr[i]);
}
return res;
}
public static void main(String[] args) {
int t = scanner.nextInt();
while (t-->0){
String bigNum1 = scanner.next();
String bigNum2 = scanner.next();
output.println(getBigNumSum(bigNum1,bigNum2));
output.flush();
}
output.close();
}
}
方法二:
Java的工具类非常的强大,我们可以直接使用BigInteger工具类进行大数相加运算
代码:
//努力学习Java
package 大整数相加问题;
import java.io.*;
import java.math.BigInteger;
import java.util.Scanner;
public class 利用大数工具类 {
static StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int t = scanner.nextInt();
while (t-->0) {
String a = scanner.next();
String b = scanner.next();
BigInteger bigNum1 = new BigInteger(a);
BigInteger bigNum2 = new BigInteger(a);
output.println(bigNum1.add(bigNum2));
output.flush();
}
}
}