上次同学在微软就面到这个了。
比较烦的是处理符号。
有两个注意的:第一个是中间保存结果要用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;
}