题目描述
请设计一个算法完成两个超长正整数的加法。
输入描述:
输入两个字符串数字
输出描述:
输出相加后的结果,string型
算法思想
- 用两个字符数组分别逆序存储两个字符串所表示的整数;
- 遍历前面两个数组,按位相加, 用比前面两个字符数组中最大的字符数组还大一点的数组保存结果,多出来的一位保存是否进位;
- 如果结果数组的最后一个元素为1,则表示有进位,把数组逆序转为String;若为0,则表示无进位,从倒数第二个元素开始逆序存储为String
Java代码
import java.util.*;
public class Main{
public static String AddLongInteger(String addend, String augend)
{
//逆序存储两个字符串所表示的整数
char[] ch1 = new StringBuilder(addend).reverse().toString().toCharArray();
char[] ch2 = new StringBuilder(augend).reverse().toString().toCharArray();
int length = ch1.length > ch2.length ? ch1.length + 1 : ch2.length + 1;
//用一个稍微大一点的数组来保存结果
int[] ret = new int[length];
//遍历数组,按位相加
for(int i = 0; i < length; i++){
int tmp = ret[i];
if(i < ch1.length){
tmp += ch1[i] - '0';
}
if(i < ch2.length){
tmp += ch2[i] - '0';
}
//判断进位
if(tmp > 9){
tmp -= 10;
ret[i + 1] = 1;
}
ret[i] = tmp;
}
//结果数组逆序转为String
StringBuilder sb = new StringBuilder();
//判断有无进位
int head = length - 1;
if(ret[length - 1] == 0){
head = ret.length - 2;
}
for(int i = head; i >= 0; i--){
sb.append(ret[i]);
}
return sb.toString();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str1 = sc.next();
String str2 = sc.next();
System.out.println(AddLongInteger(str1, str2));
}
}
}