[各种面试题] 大数乘法

本文介绍了一种处理大数乘法的方法,尤其关注符号处理和使用vector<int>来避免溢出的问题。通过两个字符串表示的大整数进行乘法运算,并详细解释了其实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上次同学在微软就面到这个了。

比较烦的是处理符号。

有两个注意的:第一个是中间保存结果要用vector<int> 不能用string,否则会溢出。

二是注意有无符号时候,需要相乘的起始位置也不一样。

//返回a*b的结果
string multiply(const string& a, const string& b) {
	if ( a.empty() || b.empty())
		return a.empty()?b:a;
	int na=a.length(),nb=b.length();
	int aNeg=0,bNeg=0;
	int afirst=0,bfirst=0;
	if ( a[0]=='-' || a[0]=='+' )
	{
		aNeg=a[0]=='-'?1:0;
		afirst=1;
	}
	if ( b[0]=='-' || b[0]=='+' )
	{
		bNeg=b[0]=='-'?1:0;
		bfirst=1;
	}
	vector<int> ret(na+nb,0);
	for(int ia=na-1;ia>=afirst;ia--)
	{
		for(int ib=nb-1;ib>=bfirst;ib--)
		{
			int sum=(a[ia]-'0')*(b[ib]-'0');
			int idx=(na-1-ia)+(nb-1-ib);
			ret[idx]+=sum;
		}
	}	
	int carry=0;
	for(int i=0;i<ret.size();i++)
	{
		int sum=ret[i]+carry;
		ret[i]=(sum%10);
		carry=sum/10;
	}
	int k=ret.size()-1;
	while(k>=0&&ret[k]==0)
		k--;
	if ( k<0 )
		return "0";
	string ans(&ret[0],&ret[k]+1);
    for(int i=0;i<ans.size();i++)
        ans[i]+='0';
	if ( aNeg^ bNeg )
		ans.push_back('-');
	reverse(ans.begin(),ans.end());
	return ans;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值