本代码主要用于一个大数乘以一个小数
本代码不支持两个大数相乘
跟高精度加法和高精度减法有所不同 ,高精度乘法只有一个大数字a,b是小数字,可以直接输入,不用开辟新数组
本代码中,t依旧是代表进位
请同时结合代码体会下面的讲解,不然是看不懂的
我们接下来以 19*14 = 266 举例讲解
1 第一步
首先t=0;
sum[0]=(9*14+0)%10 = 6
t = (9*14+0)/10 =12
2 第二步
此时t = 12
sum[1] = (1*14+12)%10 = 6
t = (1*14+12)/10 = 2
3 第三步
此时已经跳出循环,但是t并不等于零,说明还有进位,所以我们将t补到最后一位
//高精度乘法模板函数
void mul(v &a, int &b){
int t = 0; //t在这作为进位
for(int i=0;i<a.size();i++){
//只留下个位数作为本位数字,其余都要进位上去
sum.push_back((a[i]*b+t)%10);
t = (a[i]*b+t)/10; //新的进位要把原先的进位也算上
}
if(t)sum.push_back(t); //如果最后还有进位,把最后一位也算上
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
typedef vector<int > v;
string s1;//读入的数字字符串
vector<int >sum; //保存最后答案
vector<int >a;//两个乘数
int b; //存储第二个数字
void mul(v &a, int &b){
int t = 0; //t在这作为进位
for(int i=0;i<a.size();i++){
//只留下个位数作为本位数字,其余都要进位上去
sum.push_back((a[i]*b+t)%10);
t = (a[i]*b+t)/10; //新的进位要把原先的进位也算上
}
if(t)sum.push_back(t); //如果最后还有进位,把最后一位也算上
}
int main(){
cin>>s1>>b;
for(int i=s1.size()-1;i>=0;i--)a.push_back(s1[i]-'0');
if(a.back()==0||b==0)cout<<0;
else{
mul(a, b);
for(int i=sum.size()-1;i>=0;i--)cout<<sum[i];
}
return 0;
}