Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
大整数相乘需要一点技巧,如果用string的话会非常方便!!!
using namespace std;
//using std::random_shuffle;
class Solution {
public:
string multiply(string num1, string num2) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
string asum("0"),msum;
string::iterator it;
if(num1=="0")
return string("0");
for(it=num2.begin() ; it!=num2.end() ; it++){
msum=rmultiplysingle(num1,*it);
asum=radd(asum,msum);
num1.insert(num1.begin(),'0');
}
reverse(asum.begin(),asum.end());
return asum;
}
string radd(const string& num1, const string& num2){
int lengtha,lengthb;
int i;
lengtha=num1.size();
lengthb=num2.size();
int length=lengtha>lengthb?lengtha+1:lengthb+1;
string ta(length,'0');
string tb(length,'0');
string tc(length,'0');
int remain,carry;
remain=0,carry=0;
for(i=0 ; i<lengtha ; i++)
ta[i]=num1[i];
for(i=0 ; i<lengthb ; i++)
tb[i]=num2[i];
for(int i=0 ; i<length ; i++){
remain=((ta[i]-'0')+(tb[i]-'0')+carry)%10;
tc[i]='0'+remain;
carry=((ta[i]-'0')+(tb[i]-'0')+carry)/10;
}
if(tc[length-1]=='0')
tc.erase(tc.end()-1);
return tc;
}
string rmultiplysingle(const string& num , char c){
if(c=='0')
return string("0");
int length=num.size()+1;
string ta(length,'0');
string tb(length,'0');
int i=0;
int remain,carry;
remain=0,carry=0;
int num2=c-'0';
for(i=0 ; i<length-1 ; i++)
ta[i]=num[i];
for(i=0 ; i<length ; i++){
remain=(num2*(ta[i]-'0')+carry)%10;
tb[i]='0'+remain;
carry=(num2*(ta[i]-'0')+carry)/10;
}
if(tb[length-1]=='0')
tb.erase(tb.end()-1);
return tb;
}
};拓展了一个求幂的运算:
class Solution {
public:
string multiply(string num1, string num2) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
string asum("0"),msum;
string::iterator it;
if(num1=="0")
return string("0");
for(it=num2.begin() ; it!=num2.end() ; it++){
msum=rmultiplysingle(num1,*it);
asum=radd(asum,msum);
num1.insert(num1.begin(),'0');
}
reverse(asum.begin(),asum.end());
return asum;
}
string power(const string& num1,const int& num2){
if(num2==0)
return string("1");
string result="1";
for(int i=0 ; i<num2 ; i++)
result=multiply(result,num1);
return result;
}
string radd(const string& num1, const string& num2){
int lengtha,lengthb;
int i;
lengtha=num1.size();
lengthb=num2.size();
int length=lengtha>lengthb?lengtha+1:lengthb+1;
string ta(length,'0');
string tb(length,'0');
string tc(length,'0');
int remain,carry;
remain=0,carry=0;
for(i=0 ; i<lengtha ; i++)
ta[i]=num1[i];
for(i=0 ; i<lengthb ; i++)
tb[i]=num2[i];
for(int i=0 ; i<length ; i++){
remain=((ta[i]-'0')+(tb[i]-'0')+carry)%10;
tc[i]='0'+remain;
carry=((ta[i]-'0')+(tb[i]-'0')+carry)/10;
}
if(tc[length-1]=='0')
tc.erase(tc.end()-1);
return tc;
}
string rmultiplysingle(const string& num , char c){
if(c=='0')
return string("0");
int length=num.size()+1;
string ta(length,'0');
string tb(length,'0');
int i=0;
int remain,carry;
remain=0,carry=0;
int num2=c-'0';
for(i=0 ; i<length-1 ; i++)
ta[i]=num[i];
for(i=0 ; i<length ; i++){
remain=(num2*(ta[i]-'0')+carry)%10;
tb[i]='0'+remain;
carry=(num2*(ta[i]-'0')+carry)/10;
}
if(tb[length-1]=='0')
tb.erase(tb.end()-1);
return tb;
}
};
本文介绍了一种使用C/C++实现大整数相乘和幂运算的方法,包括字符串反转、逐位相加、乘单字符整数及递增插入零等步骤。
202

被折叠的 条评论
为什么被折叠?



