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());
全部评论

相关推荐

来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 11:31
点赞 评论 收藏
分享
07-05 16:23
门头沟学院 Java
mengnankk:我投了300,约了5 6个面试。感觉项目写的太多了。一个项目就写五六个亮点,不是把整个项目的功能描述下。其他的没啥,简历看起来有点长
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务