1.1 高精度
数据
数据输入
vector<int> read(){
string s;
cin >> s;
vector<int> C;
for(int i = s.size() - 1;i >= 0;i--){
int x = s[i] - '0';
C.push_back(x);
}
return C;
}数据输出
void write(vector<int> C){
for(int i = C.size() - 1;i >= 0;i--){
cout << C[i];
}
}1 高精度加法
vector<int> add(vector<int> A,vector<int> B){
if(A.size() < B.size()) return add(B,A);
int carry = 0;
vector<int> C;
for(int i = 0;i < A.size();i++){
carry += A[i];
if(B.size() > i) carry += B[i];
C.push_back(carry % 10);
carry /= 10;
}
if(carry) C.push_back(carry);
return C;
}题目追踪:
A + B Problem II
数楼梯
2 高精度减法
bool cmp(vector<int> A,vector<int> B){
if(A.size() != B.size()) return A.size() > B.size();
else {
for(int i = A.size() - 1;i >= 0;i--){
if(A[i] != B[i]) return A[i] > B[i];
}
}
return true;
}
vector<int> mul(vector<int> A,vector<int> B){
int carry = 0;
vector<int> C;
for(int i = 0;i < A.size();i++){
carry = A[i] - carry;
if(B.size() > i) carry -= B[i];
C.push_back((carry + 10) % 10);
carry = carry < 0 ? 1 : 0;
}
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}3 高精度 * 低精度
// C = A * b, A >= 0, b >= 0
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;
}题目追踪:
阶乘之和
4 高精度 * 高精度
vector<int> mul(vector<int> A,vector<int> B){
int carry = 0;
vector<int> C(A.size() + B.size(), 0);
for(int i = 0;i < A.size();i++){
carry = 0;
int j;
for(j = 0;j < B.size();j++){
carry += A[i] * B[j] + C[i+j];
C[i+j] = carry % 10;
carry /= 10;
}
if(carry) C[i+j] = carry;
}
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}题目追踪:
A + B Problem II
数楼梯
5 高精度 / 低精度
6 高精度 / 高精度
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果