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,应该舍弃。