题目
思路
整体就是 手算是怎么算的 代码基本就是怎么敲的
- 先用len1和len2表示两个需要计算的字符串的长度,然后,判断哪个字符串更长一点,总是让len2和num2做更短的那个。这样总是让短中的每个字符去乘以长中的字符(尽量少算几次)
- 两层反向的for循环,且用一个整型的数组盛放每次乘积的结果,并判断乘积是否大于10,若大于则进位(这里需要注意的就是乘积是有可能是20+或30+的,所以进位的数字不应该仅仅是+1的,第一次就是掉了这个坑)
- 然后,就是倒序将数字中的乘积结果再转为字符串的形式
- 注意:若两个字符串有一个是“0”,返回结果也应该是“0”(字符串)而不是0(整型)(这个又是掉了一次坑)
代码
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
string multiply(string num1, string num2) {
if(num1=="0"||num2=="0") return "0";//0乘以任何数都是0,注意返回的得是“0”(字符串0,而不是整型0)
int len1=num1.length();
int len2=num2.length();
string mul;
vector<int> muls(len1+len2);
if(len1<len2){
//每回都让len2和num2是较短的那个字符串
swap(num1,num2);
swap(len1,len2);
}
//开始相乘
int pos1=0;//乘数的在个位从个位开始,在百位的从百位开始...pos1是控制本次相乘从哪开始的
for(int i=len2-1;i>=0;i--){
int pos2=0;//乘积结果现在是第几个了
for(int j=len1-1;j>=0;j--){
muls[pos1+pos2] += (num2[i]-'0')*(num1[j]-'0');
if(muls[pos1+pos2]>9){
int cnt=muls[pos1+pos2]/10;//判断目前结果是10的几倍
muls[pos1+pos2+1] += cnt;//向高位进位
muls[pos1+pos2] -= cnt*10;//本位减
}
pos2++;
}
pos1++;
}
//开始倒序转为字符串
int size=muls.size();
int k=size-1;
for(k;k>=0;k--)
if(muls[k]!=0) break;
for(k;k>=0;k--){
mul += (muls[k]+48);
}
return mul;
}
int main(){
string num1, num2;
cin>>num1>>num2;
string mul=multiply(num1, num2);
cout<<mul<<endl;
return 0;
}