一、题目链接
http://noi.openjudge.cn/ch0106/10/
二、解题思路
◎ 根据题意分解出两个子问题:移除用字符串表示的给定非负大整数的前导0、计算两个用字符串表示的非负大整数的和;
◎ 移除用字符串表示的给定非负大整数的前导0:找到第一个非0字符的位置,返回该位置开始往后的子串,如果所有字符均为0,返回0;
◎ 计算两个用字符串表示的非负大整数的和:将两个非负大整数转为数组,从低位到高位,依次逐位求和。
三、实施步骤
四、Java程序
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public String removeLeadingZeros(String num) {
int n = num.length();
int nonzeroPos = 0;
while (nonzeroPos < n) {
if (num.charAt(nonzeroPos) != '0') {
return num.substring(nonzeroPos);
}
nonzeroPos++;
}
return "0";
}
public int[] add(String one, String two) {
one = removeLeadingZeros(one);
two = removeLeadingZeros(two);
int p = one.length();
int q = two.length();
int n = Math.max(p, q);
int[] A = new int[n];
int[] B = new int[n];
int[] ans = new int[n + 1];
int carry = 0;
int i;
int j;
for (i = p - 1, j = n - 1; i >= 0; i--, j--) {
A[j] = one.charAt(i) - '0';
}
for (i = q - 1, j = n - 1; i >= 0; i--, j--) {
B[j] = two.charAt(i) - '0';
}
for (i = n; i >= 1; i--) {
ans[i] = A[i - 1] + B[i - 1] + carry;
if (ans[i] > 9) {
carry = 1;
ans[i] = ans[i] % 10;
}
else {
carry = 0;
}
}
if (carry == 1) {
ans[0] = 1;
return ans;
}
return Arrays.copyOfRange(ans, 1, n + 1);
}
public static void main(String[] args) {
Main test = new Main();
Scanner input = new Scanner(System.in);
String one = input.next();
String two = input.next();
int[] ans = test.add(one, two);
for (int i : ans) {
System.out.print(i);
}
}
}