415. 字符串相加
题解思路:
大数相加无非就是每个位的数先相加,然后把对应的进位补齐
图解:
步骤:
1.先得到两个数的位数,并且创造一个string ret位数比两个string中最大的位数再大一位
2.拿的最后的位的位置,并且两个string都需要一个临时的int类型来存储拿下来的数进行加法,还要有一个int类存储下一个位置是否要进位
3.设计一个循环,直到两个string所有值被遍历过一遍,我们从最后位算起,为了效率选择尾插,但是我们要知道ret最后得到的数是完全倒过来的
4.循环里,要明确string中拿下来的数是什么,写一个三目判断,如果取的位置还在string范围里,则取的位置往前移动,取的数塞到end里;如果取的位置不在string里了,说明string的数取完了,那就对应是取0了
5.将end的数相加并且加上进位值,得到的sum再/10得到的值给进位用于下一次两end相加时加上;sum也要%10再存到开辟的string里
6.循环结束,看看是否还要剩余的进位,如果有则加1尾插string中
7.reverse一下ret,输出ret
代码:
class Solution { public: string addStrings(string num1, string num2) { int size1 = num1.size()-1; int size2 = num2.size()-1; int end1=0,end2=0,tmp = 0; string ret; int max = (size1>=size2)?size1:size2; ret.reserve(max+1); while(size1>=0||size2>=0) { end1=(size1>=0)?(num1[size1--]-'0'):0; end2=(size2>=0)?(num2[size2--]-'0'):0; int sum = end1+end2+tmp; tmp=sum/10; sum%=10; ret+=sum+'0'; } if(tmp==1) ret+='1'; reverse(ret.begin(),ret.end()); return ret; } };
43. 字符串相乘
解题思路:(需要用到大数加法的函数)
在我看来,乘法就可用被看成一大堆二数相乘后再进行数的加法图片演示:
步骤:
1.确定是循环两层
2.在循环中,用一个tmp记录每次两数相乘的结果,需要注意减去‘0’
3.在循环里建立一个临时的string s
4.需要把tmp和后面要加对应的0导入s中,我们能知道每次循环需要添加size1+size2-i-j个零。首先把这么多个0加到s中,然后倒着把tmp导入到s中,由于s在这个过程是倒着记录的,所以最后还要reverse逆置回来
5.把每次最后得到的s加到ret中代码:
class Solution { public: string addStrings(string num1, string num2) { int size1 = num1.size() - 1; int size2 = num2.size() - 1; int end1 = 0, end2 = 0, tmp = 0; string ret; int max = (size1 >= size2) ? size1 : size2; ret.reserve(max + 1); while (size1 >= 0 || size2 >= 0) { end1 = (size1 >= 0) ? (num1[size1--] - '0') : 0; end2 = (size2 >= 0) ? (num2[size2--] - '0') : 0; int sum = end1 + end2 + tmp; tmp = sum / 10; sum %= 10; ret += sum + '0'; } if (tmp == 1) ret += '1'; reverse(ret.begin(), ret.end()); return ret; } string multiply(string num1, string num2) { if (num1 == "0" || num2 == "0") return "0"; string ret; int tmp = 0,i=0,j=0; size_t size1 = num1.size() - 1; size_t size2 = num2.size() - 1; for (i = size1; i >= 0; i--) { for (j = size2; j >= 0; j--) { string s; tmp=(num1[i]-'0')*(num2[j]-'0'); for(int k=0;k<size1+size2-i-j;k++) { s+="0"; } while(tmp) { s+=(tmp%10+'0'); tmp/=10; } reverse(s.begin(),s.end()); ret=addStrings(ret,s); } } return ret; } };