高精度加法
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;
using PII = pair<int, int>;
const int N = 1e5+5;
vector<int> add(vector<int>&A, vector<int>&B) {
if (A.size() < B.size()) {
return add(B, A);
}
vector<int>C;
int t = 0;
for (auto i = 0; i < A.size(); i++) {
t += A[i];
if (i < B.size()) {
t += B[i];
}
C.push_back(t % 10);
t /= 10;
}
if (t) {
C.push_back(t);
}
return C;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
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 = add(A, B);
for (int i = C.size() - 1; i >= 0; i--) {
cout << C[i];
}
return 0;
}
高精度减法
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;
using PII = pair<int, int>;
const int N = 1e5+5;
bool cmp(vector<int>&A, 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(vector<int>A, vector<int>B) {
vector<int>C;
int t = 0;
for (int i = 0; i < A.size(); i++) {
t = A[i] - t;
if (i < B.size()) {
t -= B[i];
}
C.push_back((t + 10) % 10);
if (t < 0) {
t = 1;
} else {
t = 0;
}
}
while (C.size() > 1 && C.back() == 0) {
C.pop_back();
}
return C;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
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>C;
if (cmp(A, B)) {
C = sub(A, B);
} else {
C = sub(B, A);
cout << '-';
}
for (int i = C.size() - 1; i >= 0; i--) {
cout << C[i];
}
return 0;
}
高精度乘法
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;
using PII = pair<int, int>;
const int N = 1e5 + 5;
vector<int> mul(vector<int>& A, vector<int>& B) {
// 结果最多为 A.size() + B.size() 位
vector<int> C(A.size() + B.size(), 0);
for (int i = 0; i < A.size(); i++) {
for (int j = 0; j < B.size(); j++) {
C[i + j] += A[i] * B[j];
// 处理进位
C[i + j + 1] += C[i + j] / 10;
C[i + j] %= 10;
}
}
// 去掉前导零
while (C.size() > 1 && C.back() == 0) {
C.pop_back();
}
return C;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
string a, b;
cin >> a >> b;
vector<int> A, B;
// 把数字倒序存储到 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];
cout << endl;
return 0;
}
高精度除法
#include <bits/stdc++.h>
using namespace std;
vector<int> div(vector<int> &A, int b, int &r)
{
vector<int> C;
r = 0;
for (int i = A.size() - 1; i >= 0; i -- )
{
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end());
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main()
{
string a;
vector<int> A;
int B;
cin >> a >> B;
for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
int r;
auto C = div(A, B, r);
for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
cout << endl << r << endl;
return 0;
}