[leetcode] Multiply Strings

本文介绍了一种使用C/C++实现大整数相乘和幂运算的方法,包括字符串反转、逐位相加、乘单字符整数及递增插入零等步骤。

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;
	}
};


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值