59 大数加法

leetcode上不了,做一下牛客网的

题目

以字符串的形式读入两个数字,再以字符串的形式输出两个数字的和。

输入描述:

输入两行,表示两个数字a和b,-109 <= a , b <= 109 ,用双引号括起。

输出描述:

输出a+b的值,用双引号括起。

输入例子1:

“-26”
“100”

输出例子1:

“74”

分析

思路一:定义String变量str1和str2分别存储输入的两个大数,定义num1[]和num2[]两个int型数组,将两个字符串分别逐个字符逆序存入数组,定义sum[]数组存放求和结果,使用循环两个数组中的元素逐位相加,并判断是否进位,最后逆序输出数组sum[]中的每个元素。

String a="99999999999";
String b="99999999999";
// 存放a的数组
int[] num1 = new int[a.length()];
// 存放b的数组
int[] num2 = new int[b.length()];
// 存放a+b的数组长度,取两者最大的一个并+1,因为可能有进位
int len = 1 + Math.max(a.length(),b.length());
// 存放a+b的数组
int[] res = new int[len];

// 将字符串一一填充到数组中,必须选择逆向填充,因为:
// 考虑1+123,如果是正向填充,那么顺序如下:
// 1
// 1 2 3
// 但是我们要执行的是从最低位开始相加,比如1+3,此时无法定位到1+3
// 如果是逆向填充,如下:
// 1
// 3 2 1
// 此时只需要按位置对应相加即可
for(int i=0;i<a.length();++i){
    // 不能使用charAt,得到的是ascii,而ascii本质上也是int
    num1[a.length()-i-1]=Integer.parseInt(a.substring(i,i+1));
}

// 将b填充到数组中
for(int i=0;i<b.length();++i){
    num2[b.length()-i-1]=Integer.parseInt(b.substring(i,i+1));
}

// 初始化进位为0
int overflow=0;
for(int i=0;i<len-1;++i){
    // 按顺序相加,并加上进位
    res[i] = num1[i]+num2[i]+overflow;
    // 如果大于10,说明需要进位
    if (res[i]>=10){
        res[i] = res[i]%10;
        overflow=1;
    }else {
        overflow=0;
    }
}
// 执行完毕之后,如果进位上为1,那就把它放在最高位(res的最后一位)
if(overflow==1){
    res[len-1] = overflow;
}

// 逐个输出
// 由于最后一位如果没有产生进位,那么会多一个0,此处将0排除
int i=len-1;
if (res[len-1]==0) i=len-2;
for (;i>=0;i--){
    System.out.print(res[i]);
}

System.out.println();

// 字符串形式输出
StringBuffer sb = new StringBuffer();
int start=len-1;
if(res[len-1]==0) start=len-2;
while (start>=0){
    sb.append(res[start]);
    start--;
}
System.out.println(sb.toString());
// 以数字型输出,不能通过int输出,会报错
System.out.println(new BigInteger(sb.toString()));

思路二:使用栈结构实现将输入的数字依次存进栈中(栈有先进后出的特点,所以先输入的高位上的数字会被存在栈的底层),在计算和的时候从两个栈中依次取出数据相加存入新的栈中(计算时在栈顶的是个位,然后是十位,以此类推,存进新的栈时在栈底的是个位,然后是十位,以此类推),最后将存放计算结果的栈中元素自顶向底取出打印,这种方法效率较高,时间复杂度低,但是空间复杂度很大,需要占用较多的空间资源。

思路三:

String str1 = "999999999999";
String str2 = "999999999999";
BigInteger a;
BigInteger b;
BigInteger c;

a = new BigInteger(str1);
b = new BigInteger(str2);
System.out.println(a.add(b).toString());
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务