点个赞吧QWQ
$$高精度乘法$$
题目大意:给定一个高精度数A和一个低精度数B,求它们的积
思路
- 老规矩,先把字符串转换为数组
- 定义一个t
- 首先使t=a[i] * b[i]
- 然后让答案=t的个位
- 把t看成进位,/=10
- 处理剩下的t
图片思路:(别说我是抄的)
代码1(字符串):
#include<iostream>
#include<cmath>
using namespace std;
string s1,s2;
int a[100001],b[100001],c[100001];
void Mul(){
c[0]=a[0]+b[0];
int jw;
for(int i=1;i<=b[0];i++){
jw=0;
for(int j=1;j<=a[0];j++){
c[i+j-1]+=a[j]*b[i]+jw;
jw=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+a[0]]=jw;
}
while(c[c[0]]==0&&c[0]>1)
c[0]--;
}
int main(){
cin>>s1>>s2;
a[0]=s1.size();
b[0]=s2.size();
for(int i=1;i<=a[0];i++)
a[i]=s1[a[0]-i]-'0';
for(int i=1;i<=b[0];i++)
b[i]=s2[b[0]-i]-'0';
Mul();
for(int i=c[0];i>=1;i--)
cout<<c[i];
cout<<endl;
return 0;
}
代码2(vector):
#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; // t + A[i] * b = 7218
C.push_back(t % 10); // 只取个位 8
t /= 10; // 721 看作 进位
}
while (t) { // 处理最后剩余的 t
C.push_back(t % 10);
t /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
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;
}