问题描述:
请设计一个算法完成两个超长正整数的加法。
接口说明
/*
请设计一个算法完成两个超长正整数的加法。
输入参数:
String addend:加数
String augend:被加数
返回值:加法结果
*/
public String AddLongInteger(String addend, String augend)
{
/*在这里实现功能*/
return null;
}
输入描述:
输入两个字符串数字
输出描述:
输出相加后的结果,string型
示例1
输入
99999999999999999999999999999999999999999999999999 1
输出
100000000000000000000000000000000000000000000000000
分析:
1.首先输入两个字符串,比较两个字符串的长度,用最大的长度来设定数组的长度。
2.将字符串中的数字一个一个的放入到对应的数组中。注意:放的时候需要倒着放(个位放数组中第0个元素),这样是为了保证两个数进行加法运算的时候不会出现位数不够的情况。
3.额外申请一个数组S,他的长度为最大字符串的长度再加一,除了S中最后一个元素的值为进位位,其余的S中存放的全是计算后的值。
例:当i= 0时,s[0] 中放的是 a数组和b数组第一个数相加后在对十求模,此时s[1]中放的是进位位。
当i=1时,s[1]中放的是 a数组和b数组第二个数相加后在对十求模(覆盖了上次的值),此时s[2]中放的是进位位。
4.如果S数组中的最后一个元素不为0的话,那么就说明还有进位,循环需要从0开始,如果S数组中的最后一个元素为0的话,那么就说明没有进位,循环需要从1开始。输出时,从S数组中的最后一个元素开始往前输出。
import javax.swing.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String a = sc.nextLine();
String b = sc.nextLine();
// 求出两个字符串中较长的那个字符串长度
int lenA = a.length();
int lenB = b.length();
int lenS = Math.max(lenA, lenB);
// S保存最终生成的结果
int[] A = new int[lenS];
int[] B = new int[lenS];
int[] S = new int[lenS + 1];
for (int i = 0; i < lenA; i++) {
A[i] = a.charAt(lenA - 1 - i) - '0';
}
for (int i = 0; i < lenB; i++) {
B[i] = b.charAt(lenB - 1 - i) - '0';
}
for (int i = 0; i < lenS; i++) {
int sum = S[i] + A[i] + B[i];
int flag = sum /10;
S[i] = sum % 10;
S[i+1] += flag;
}
for (int i = (S[lenS] == 0?1:0); i < lenS + 1; i++) {
System.out.print(S[lenS - i]);
}
System.out.println();
}
sc.close();
}
}