在Java语言中,整数相加受到了位数的限制,请实现两个超大整数的加法。
输入格式:
两个超大整数,由于超出了范围,所以是以字符串的方式存储的。
输出格式:
输出两个超大整数相加的结果。
输入样例:
12345678909876543210
98765432101234567890
结尾无空行
输出样例:
在这里给出相应的输出。例如:
12345678909876543210+98765432101234567890=111111111011111111100
结尾无空行
下面展示实现代码(代码里面有注释):
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s1 = sc.nextLine();
String s2 = sc.nextLine();
int max,jinwei = 0,f=0;
if (s1.length() >= s2.length()){
max = s1.length();
}
else {
max = s2.length();
} //第一步,找出两个字符串中较长的一个并记录,方便下面设置数组长度
int[] a1 = new int[max+1];
int[] a2 = new int[max+1];
int[] a3 = new int[max+1]; //第二步,设置三个长度相同的数组,且长度均为字符串长度最大那个+1(方便结果进位),a1,a2为字符串转换后的数组,a3为结果数组
for (int i = max ,k = s1.length() - 1; i >= max+1-s1.length(); i--){
a1[i] = s1.charAt(k--) - '0';
}
for (int i = max ,k = s2.length() - 1; i >= max+1-s2.length(); i--){
a2[i] = s2.charAt(k--) - '0';
} //第三步,将字符串转换为数组
for (int i = a3.length-1; i >= 0; i--){
a3[i] = (a1[i] + a2[i] + jinwei) % 10; //结果数组中最终实际记录的数字
jinwei = (a1[i] + a2[i] + jinwei) / 10; // 进位数
} //第四步,开始计算;注意结果数组中最终实际记录的数字和进位数
//前四步,计算就已经完成了,后面只是打印结果
for (int i = 0; i < a1.length; i++){
while(a1[i] == 0 && f == 0){
i++;
}//这一步主要是防止打入数组开头的初始化的0,毕竟有些数组位置没有用到。用标志法来完成,有点愚蠢,欢迎各位读者提出自己的办法来取消打印数组开头的0
f = 1;//f即标志
if (f == 1){
System.out.print(a1[i]);
}
}
f = 0;//注意标志要清0
System.out.print("+");
for (int i = 0; i < a2.length; i++){
while(a2[i] == 0 && f == 0){
i++;
}
f = 1;
if (f == 1){
System.out.print(a2[i]);
}
}//同样的方法打印
System.out.print("=");
f=0;
for (int i = 0; i < a3.length; i++){
while(a3[i] == 0 && f == 0){
i++;
}
f = 1;
if (f == 1){
System.out.print(a3[i]);
}
}//同样的方法打印
}
}
完成大数相加,其实也可以不用定义三个一样长的数组,只需要这三个数组的右对齐就可以了,只不过设置三个一样长的数组可以防止思路不清晰。在打印环节也可用增强for循环,代码更简洁。此处未作展示。大数相加考点在数组的运用,完成了大数相加,思路清晰的友友们可以完成一下大数相乘,有一定难度。欢迎各位提出意见和建议。