题目之大数运算
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题目之大数运算相关的知识,希望对你有一定的参考价值。
加
题目链接
题目描述
:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
思路
:
- 创建一个进位位,从两个字符串尾部开始遍历
- 只要有一个字符串不小于0或进位位不等于0,进行-‘0’记录此个位数字,然后三数相加(进位,num1,num2)
- 大于10就把进位位置为sum/10,再往复循环
代码如下:
class Solution { public: string addStrings(string num1, string num2) { string s1; int add=0,size1=num1.length()-1,size2=num2.length()-1; while(size1>=0||size2>=0||add!=0) { int x=size1>=0?num1[size1]-'0':0; int y=size2>=0?num2[size2]-'0':0; int sum=x+y+add; s1.push_back('0'+sum%10); add=sum/10; size1--; size2--; } reverse(s1.begin(),s1.end()); return s1; } };
注意:在c++中insert非常不推荐使用,在这里反转字符串的时候用insert会把时间复杂度提到O(n^2)
乘
题目描述
:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
思路一
: (时间复杂度
:O(mn+n^2) m,n两字符串的长度,空间复杂度
:O(m+n))
- 做加法,以num2为乘数便利每一位,以乘法处理方式(注意加0问题)
- 每一次乘出的值用加法逻辑相加
代码如下:
class Solution {
public:
string addStrings(string num1, string num2) {
string s1;
int add=0,size1=num1.length()-1,size2=num2.length()-1;
while(size1>=0||size2>=0||add!=0)
{
int x=size1>=0?num1[size1]-'0':0;
int y=size2>=0?num2[size2]-'0':0;
int sum=x+y+add;
s1.push_back('0'+sum%10);
add=sum/10;
size1--;
size2--;
}
reverse(s1.begin(),s1.end());
return s1;
}
string multiply(string num1, string num2) {
if(num1=="0"||num2=="0")
{
return "0";
}
else
{
int carry=0,i1=num1.size()-1,i2=num2.size()-1;
string sum="";
for(int i=num2.size()-1;i>=0;--i)
{
string ret;
i1 = num1.size() - 1;
while(i1>=0||carry!=0)
{
int x=i1>=0?num1[i1]-'0':0;
int y=(num2[i]-'0');
int multi=x*y+carry;
ret.push_back((multi%10)+'0');
carry=multi/10;
i1--;
}
reverse(ret.begin(),ret.end());//注意这里不是.end()-1
int count=num2.size()-1-i;//计数添几个0
while(count--)
{
ret.push_back('0');
}
sum=addStrings(ret,sum);
}
return sum;
}
}
};
思路二
:
- 做乘法,由于两数相乘必为m+n或m+n-1
以上是关于题目之大数运算的主要内容,如果未能解决你的问题,请参考以下文章