蒟蒻刷题记录
高精度乘高精度(双精度乘法)
P1303 A*B Problem
题目描述
求两数的积。输入格式 两行,两个整数。
输出格式 一行一个整数表示乘积。
说明/提示
每个数字不超过 10^2000 ,需用高精。
先上AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
vector<int>a,b;
string s1,s2;
void init(string s,vector<int> &v)
{
int n = s.size();
reverse(s.begin(),s.end());
for(int i = 0;i < n;i++) v.push_back(s[i]-'0');
}
vector<int> mul(vector<int>a,vector<int>b)
{
vector<int>c(a.size()+b.size());
for(int i = 0;i < a.size();i++)
for(int j = 0;j < b.size();j++)
c[i+j] += a[i]*b[j];
int n = a.size() + b.size();
for(int i = 0;i < n-1;i++)
{
c[i+1] += c[i] / 10;
c[i] = c[i] % 10;
}
while(c.size() > 1&&c.back() == 0) c.pop_back();
return c;
}
int main()
{
cin>>s1>>s2;
init(s1,a);
init(s2,b);
vector<int>res = mul(a,b);
for(int i = res.size()-1;i >= 0;i--) cout<<res[i];
cout<<endl;
return 0;
}
最早是这么思考的但是代码十分复杂
#include<bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int> &A,vector<int> &B)
{
vector<int>res;
int p = 0;
for(int j = 0;j < B.size();j++)
{
//cout<<p<<endl;
vector<int> C;
int t = 0;
for(int i = 0;i < A.size()||t;i++)
{
if(i < A.size()) t += A[i]*B[j];
C.push_back(t % 10);
t /= 10;
}
int temp = p;
if(p == 0)
{
for(long long i = 0;i < A.size()*B.size();i++)
res.push_back(0);
}
int k = 0;
for(int i = 0;i < C.size();i++)
{
k += res[temp] + C[i];
res[temp++] = (k%10);
k /= 10;
}
if(k != 0) res[temp] = k;
p++;
}
while (res.size() > 1 && res.back() == 0) res.pop_back();
return res;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> A;
vector<int> 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;
}
思路是模拟列竖式乘法,将每一层错一位相加。
本题为了方便,采用从后往前将数存在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() || t; i++)
{
if (i < A.size()) t += A[i] * b;
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 -- ) printf("%d", C[i]);
return 0;
}
代码还有不足,有什么错误欢迎指正。