题目:
大数相加链接
思路:
为了方便两个字符串相加,我们将短的字符串,前面补0,最重要的一点是我们需要设置进位标志ok
代码:
class Solution {
public:
string addStrings(string num1, string num2) {
int ok=0;
string ret;
int size_num1=num1.size();
int size_num2=num2.size();
int longsize=max(size_num1,size_num2);
for(int i=size_num1;i<longsize;i++)
{
num1="0"+num1;
}
for(int i=size_num2;i<longsize;i++)
{
num2="0"+num2;
}
for(int i=longsize-1;i>=0;--i)
{
char c=num1[i]+num2[i]-'0'+ok;
if(c>'9')
{
ok=1;
c=c-10;
}
else
{
ok=0;
}
ret=c+ret;
}
if(ok==1)
{
ret="1"+ret;
}
return ret;
}
};
题目:
大数相乘链接
思路:
这题思路其实很巧妙,首先我们必须知道 两个都不为0 的数,相乘 ,得出的积的长度一定是len1+len2-1或者是len1+len2。(eg.100100=10000 9999=9801 长度变化 2 2 5, 2 2 4) 。
我们还可以知道 ,当我们设置结果是 len(arr)= len1+len2,我们可以发现 arr[i+j+1]=arr[i]+(num[i]*num[j]) ;
最后对arr进行进位处理,只能从后向前进行遍历,并且进位。
for(int i=arr_v.size()-1;i>0;i--)
{
arr_v[i-1]=arr_v[i-1]+arr_v[i]/10;
arr_v[i]=arr_v[i]%10;
}
最后如何arr[0]==0 证明结果长度是len1+len2-1 则去掉这个元素,余下元素依次拼接就可以了
代码:
class Solution {
public:
string multiply(string num1, string num2)
{
if(num1=="0"||num2=="0") return "0";
vector<int> arr_v(num1.size()+num2.size(),0);//两个都不为0的数相乘,最终结果长度要么是num1+num2-1,要么是num1+num2
for(int i=num1.size()-1;i>=0;i--)
{
for(int j=num2.size()-1;j>=0;j--)
{
arr_v[i+j+1]+=(num1[i]-'0')*(num2[j]-'0');//字符转换成整数
}
}
//下面这种遍历也是可以的
// for(int i=0;i<num1.size();i++)
// {
// for(int j=0;j<num2.size();j++)
// {
// arr_v[i+j+1]+=(num1[i]-'0')*(num2[j]-'0');//字符转换成整数
// }
// }
for(int i=arr_v.size()-1;i>0;i--)
{
arr_v[i-1]=arr_v[i-1]+arr_v[i]/10;
arr_v[i]=arr_v[i]%10;
}
string s="";
for(int i=0;i<arr_v.size();i++)
{
if(i==0&&arr_v[i]==0) continue;
s=s+to_string(arr_v[i]);
}
return s;
}
};