编程实现大数的加法。
比如说,给出两个数a,b,它们各自的位数都大于1000(用String来表示)。这时候,我们发现,用任何一种数据类型都不足以表示这两个数,更别说表示这两个数之和了。因此,我们可以用换一种方式,通过两个数组来分别表示这两个数,然后把两个数组对应位置的元素各自相加,则可求得两个数之和。
这样处理的难点在于对齐。我们知道,加法是从低位开始相加的,转换成数组的话,如果是正常处理,则可能需要在较小数的前面补0,处理起来略微麻烦,因此我们可以通过翻转这个数,把高位放在数组的后面,这样就不需要另外去补0了。
另外一个难点是进位。我的想法是,在求出各个位置相加的和之后,再作处理。如果当前位置上的元素>9,则需要向后进位(因为此时数已经被翻转了)。
实现代码如下:
public class Main { public static void main(String[] args) { String a = null; String b = null; Scanner sc = new Scanner(System.in); a = sc.nextLine(); b = sc.nextLine(); System.out.println(getRes(a, b)); }
public static String getRes(String a, String b) {
char[] large = null;
char[] small = null;
if(a.length() > b.length()) {
large = a.toCharArray();
small = b.toCharArray();
}else {
large = b.toCharArray();
small = a.toCharArray();
}
int len = large.length;
int[] sum = new int[len];
//把这个数倒过来,处理起来比较方便
for(int i = 0; i < len; i++) {
sum[i] = large[len-1-i] - '0';
}
for(int j = 0; j < small.length; j++) {
sum[j] += (small[small.length-1-j] - '0');
}
//进位,当sum数组上的元素大于9时,则说明这个位置需要向前进位,但是由于我们前面把数倒过来,所以在这里是向后进位
for(int k = 0; k < len - 1; k++) {
if(sum[k] > 9) {
sum[k+1] += sum[k]/10;
sum[k] = sum[k] % 10;
}
}
StringBuilder sb = new StringBuilder();
//把数组元素翻转,则可求得需要的结果
for(int k = len-1; k >= 0; k--) {
sb.append(sum[k]);
}
String res = sb.toString();
//细节处理,如果该字符串的首位为0,则证明没有进位,应该把0给去掉
if(res.charAt(0) == '0') {
res = res.substring(1);
}
return res;
}
}