问题来源 : ACWing
https://www.acwing.com/blog/content/277/
高精度加法
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<int> Add(const vector<int>& a,const vector<int>& b) {
vector<int> ret;
int t = 0;
for(int i = 0, j = 0; i < a.size() || j < b.size(); i++,j++) {
if(i < a.size()) t += a[i];
if(j < b.size()) t += b[j];
ret.push_back(t % 10);
t /= 10;
}
if(t) ret.push_back(1);
return ret;
}
int main() {
string str1,str2;
cin >> str1 >> str2;
vector<int> a,b;
for(int i = str1.size() - 1; i >= 0; i--) a.push_back(str1[i] - '0');
for(int i = str2.size() - 1; i >= 0; i--) b.push_back(str2[i] - '0');
vector<int> ans = Add(a,b);
for(int i = ans.size() - 1; i>= 0; i--) printf("%d",ans[i]);
return 0;
}
高精度减法
#include <iostream>
#include <vector>
#include <string>
using namespace std;
bool compare(const vector<int>& A,const vector<int>& B) {
if(A.size() != B.size()) return A.size() > B.size();
for(int i = A.size() - 1; i >= 0; i--) if(A[i] != B[i]) return A[i] > B[i];
return true;
}
vector<int> Sub(const vector<int>& A, const vector<int>& B) {
int t = 0;
vector<int> C;
for(int i = 0; i < A.size(); i++) {
t = A[i] - t;
if(i < B.size()) t -= B[i];
C.push_back((10 + t) % 10); // t >= 0 t t < 0 (t + 10) % 10
if(t < 0) t = 1;
else t = 0;
}
// 去除前置0
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');
vector<int> ans;
if(compare(A,B)) ans = Sub(A,B);
else {
ans = Sub(B,A);
printf("-");
}
for(int i = ans.size() - 1; i>= 0; i--) printf("%d",ans[i]);
return 0;
}
高精度乘法
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<int> Mul(const vector<int>& A,const 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;
}
// 防止有一个乘数为 0 导致结果为0
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;
}
高精度除法
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<int> Div(const vector<int>& A,const int b,int& r) {
vector<int> C;
int t = 0;
for(int i = 0; i < A.size(); i++) {
t = t * 10 + A[i];
C.push_back(t / b);
t %= b;
}
reverse(C.begin(),C.end());
// 前导0
while(C.size() > 1 && C.back() == 0) C.pop_back();
r = t; // 保留余数
return C;
}
int main() {
string a;
int b;
cin >> a >> b;
vector<int> A;
for(int i = 0; i < a.size(); i++) A.push_back(a[i] - '0');
int r = 0;
auto C = Div(A,b,r);
for(int i = C.size() - 1; i >= 0; i--) cout << C[i];
cout << endl << r << endl;
return 0;
}