AcWing 793. 高精度乘法
原题链接
简单
作者:
繁花似锦
,
2020-03-11 12:58:20
,
所有人可见
,
阅读 579
前言:一个大数乘以一个小的数
洛谷练习题目,高精加 + 高精乘
数据已更新
同加法类似,三个操作数融合到t里,当前位是t%10,进位是t/10,要注意如果最高位有进位,(且乘法进位不只一位)不要忘记
while(t) // 这里是while, 进位不止一位
{
C.push_back(t % 10);
t /= 10;
}
#include <iostream>
#include <vector>
using namespace std;
vector<int> mul(vector<int> &A,int b)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size();i++)
{
t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
//if(t) C.push_back(t);
while(t) // 进位不止1位
{
C.push_back(t % 10);
t/=10;
}
while(C.size() > 1 && C.back() == 0) C.pop_back(); // 去前导0
return C;
}
int main()
{
string a;
int b;
cin >> a >> b;
vector<int> A;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
auto C = mul(A,b);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
return 0;
}
升级版:两个都是大数
思路:模拟竖式加减,错位加减
洛谷题目
#include <iostream>
#include <vector>
using namespace std;
vector<int> mul(vector<int> &A,vector<int> &B)
{
vector<int> C(A.size() + B.size());
for(int i=0;i<B.size();i++)
for(int j=0;j<A.size();j++)
{
C[i + j] += A[j] * B[i];
//printf("C[%d] = %d\n",i+j,C[i+j]);
}
for(int i=0;i<C.size();i++)
{
C[i+1] += C[i] / 10;
C[i] %= 10;
}
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main()
{
string a,b;
cin >> a >> b;
vector<int> A,B;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
auto C = mul(A,B);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
return 0;
}