两个超长正整数相加
题目描述:
请设计一个算法完成两个超长正整数的加法。借口说明:
输入参数:
String addend:加数
String augend:被加数
返回值:加法结果
public String AddLongInteger(String addend,String augend){
/*在这里实现功能*/
return null;
}
输入描述:
输入两个字符串数字
输出描述:
输出相加后的结果,string型
示例:
输入:
999999999999999999999999999
1
输出:
1000000000000000000000000000
解题思路:
1.首先将输入的两个字符串分别存入两个字符数组(a1和a2)中;
2.比较两个字符数组的长度,开辟一个新的数组(c1)长度为长度较大的字符数组长度+1(原因为若为实例此种情况,最终结果长度加1);
3.新开辟两个char数组(b1和b2)长度分别与a1和a2相同,分别将a1与a2中数据反向存储(原因是a1和a2数组中数据为直接存储,不可直接相加,因按照数学知识加法是从个位开始,但若直接相加则长度较短的数组最高位与长度较长数组最高位同位,结果出现偏差。如:输入 123 12 ,正确结果为135,但若直接相加结果变为243);
4.将b1和b2数组中数据依次相加存储至c1数组中(相加分为两种情况:相同下标下均有元素相加后存储;相同下标下一个有一个没有,直接存入有元素即可);
5.新创建数组c2,目的在于将c1数组反向存储。但一个大前提在于c1最后一个元素是否为0,若为0则c1长度减1后再将其反向存储于c2;若不为0,则直接将其反向存储于c2。
需要将c1反向存储的原因是相加后的结果也为反向的,但结果需正向输出(如输入123 12 被反向存储后为321 21 相加后得到的元素内容为:531 再次将其反转后才为正确结果135)。
判断c1最后一个元素是否为0的原因在于:c1数组开辟时比最长字符数组长度大1,若不考虑是否为0情况直接反转的话,输入123 12时得到的结果是0135,这明显是不符合数学定义的,故我们需要进行判断是否为0。
如输入 123 12 翻转后存储321 21 相加后 531 翻转后最终结果 135
如输入 999 1 翻转后存储999 1 相加后0001 翻转后最终结果 1000
6.最终将c2数组转换为String类型输出即可。
解题源码:
import java.util.Scanner;
public class JavaStudy{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
//保证不断输入
while (in.hasNext()){
String addend=in.