import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str1 = null;
String str2 = null;
String str3 = null;
StringBuffer strb = new StringBuffer();
int sum = 0;
int sp = 0;//溢出寄存器
while (in.hasNext()) {
str1 = in.nextLine();
str2 = in.nextLine();
sp = 0;
if (str1.length() < str2.length()) {//确保第一个字符串更长
str3 = str1;
str1 = str2;
str2 = str3;
}
char[] char1 = str1.toCharArray();
char[] char2 = str2.toCharArray();
//System.out.println("str1.length() = " + str1.length());
int[] int1 = new int[char1.length + 1];
int[] int2 = new int[char1.length + 1];
int[] int3 = new int[char1.length + 1];
for (int i = 1; i <= char1.length; i++) {//获取int数组
int1[i] = char1[i - 1]-48;//char是Ascii码,比数值大48
if (i < char2.length + 1) {
int2[i + char1.length - char2.length] = char2[i - 1]-48;
//char是Ascii码,比数值大48
}
}
for (int i = int1.length - 1; i >= 0; i--) {//按位累加
//System.out.println("i = " + i);
//System.out.println("int1[i] = " + int1[i]);
//System.out.println("int2[i] = " + int2[i]);
sum = int1[i] + int2[i] + sp;
if (sum > 9) {
sp = 1;
int3[i] = sum - 10;
//System.out.println("int3["+i+"] = " + int3[i]);
} else {
sp = 0;
int3[i] = sum;
//System.out.println("int3["+i+"] = " + int3[i]);
}
}
for (int i = 0; i < int3.length; i++) {
strb.append(int3[i]);
}
//System.out.println("strb.charAt(0) = " + strb.charAt(0));
if (strb.charAt(0)==48){//Ascii码的0值为48
//if (strb.charAt(0)=='0'){//Ascii码的0值为48
//System.out.println("strb.charAt(0) = " + strb.charAt(0));
strb.delete(0,1);
}
System.out.println(strb);
strb.delete(0,strb.length());
}
}
}先上代码。由于需要的是不丢失精度的整数加法,当然是不能用浮点数的加法来做。所以笔者采用了逐位相加的方式。和单片机的溢出寄存器一样,定义一个sp做溢出标记,下次需要+1进位。
中规中矩的做法,先获取输入的2个字符串,为了方便后续编程,先排序,就可以根据更长的字符串的位数+1来新建字符串,避免位数不够导致的溢出。之后就是逐位遍历,把字符数组的每一位放到int数组中。此处要注意,char数组的内容是Ascii码表示的数字,并不能直接转换为数字('0'=48,'1'=49,比正常数字大48),需要-48。笔者在此处踩了个坑,一直算不对。后边也是,追加后的stringbuffer实例对象strb的第0位也是'0'。。。
最后还得注意,如果首位是0,应该舍弃。

京公网安备 11010502036488号