admin 管理员组

文章数量: 1086866

【Java】算法积累1——大整数相加

算法刚刚入门,每次记录下自己所学的知识总结以及理解,希望能够帮助大家,如有内容有错误或可改进的地方,欢迎一起探讨,一起进步,在此也要感谢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();}}
}

本文标签: Java算法积累1大整数相加