B站已出同步讲解,欢迎观看。
希望对你学习高精度有用。
高精度加法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
string a, b; // 将输入视为一个字符串
int A[N], B[N], ans[N]; // 分别存储两个加数,以及和
int l1, l2; // 表示A,B数组分别存储到哪一位了
int main() {
cin >> a >> b;
int n = a.size(), m = b.size();
// 1.倒序存储
for (int i = n - 1; i >= 0; i --) A[l1 ++] = a[i] - '0';
for (int i = m - 1; i >= 0; i --) B[l2 ++] = b[i] - '0';
// 2.计算结果的最大长度
int l = max(l1, l2);
// 3.先计算加法
for (int i = 0; i < l; i ++)
ans[i] = A[i] + B[i];
// 4.考虑进位 与 保留位
for (int i = 0; i < l; i ++) {
// 一定要先进位再处理保留位
// 进位
ans[i + 1] += ans[i] / 10;
// 保留位
ans[i] %= 10;
}
// 5.最高位是否有进位
if(ans[l]) l ++;
// 6.处理前导零
// 特殊数据 : 1. 0012 + 02 = 14 2. 000 + 0 = 0
while(ans[l - 1] == 0 && l > 1) l --;
// 7.倒序输出答案
for (int i = l - 1; i >= 0; i --) cout << ans[i];
return 0;
}
高精度减法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
string a, b;
int A[N], B[N], C[N], l1, l2;
bool neg;
int main() {
cin >> a >> b;
// 确保 大数字 - 小数字
if(a.size() < b.size() || a.size() == b.size() && a < b) {
neg = 1;
swap(a, b);
}
int n = a.size(), m = b.size();
// 倒序存储
for (int i = n - 1; i >= 0; i --) A[l1 ++] = a[i] - '0';
for (int i = m - 1; i >= 0; i --) B[l2 ++] = b[i] - '0';
// 最大计算多少次
int l = n;
int t = 0;
for (int i = 0; i < l; i ++) {
int diff = A[i] - B[i] - t; // 表示本位差值
if(diff < 0) {
diff += 10;
t = 1;
} else {
t = 0;
}
C[i] = diff;
}
// 删除前导零
while(l > 0 && C[l] == 0) l --;
if(neg) cout << "-";
for (int i = l; i >= 0; i --) cout << C[i];
return 0;
}
高精度*低精度
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1e5 + 10;
int A[N], l;
int main() {
string a; cin >> a;
// 将字符串转化为数字存储在数组中
for (int i = a.size() - 1; ~i; i --) A[l ++] = a[i] - '0';
int b; cin >> b;
if(b) l += log10(b);
// 先进行乘法
for (int i = 0; i < l; i ++)
A[i] *= b;
// 在考虑进位
for (int i = 0; i < l; i ++) {
// 先进位后存储,不然BBQ
A[i + 1] += A[i] / 10;
A[i] %= 10;
}
// 判断是否存在前导零
while(l > 0 && A[l] == 0) l --;
for (int i = l; ~i; i --) cout << A[i];
return 0;
}
高精度 * 高精度
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int A[N], B[N], C[N], l1, l2;
int main() {
string a, b; cin >> a >> b;
int n = a.size(), m = b.size();
for (int i = n - 1; ~i; i --) A[l1 ++] = a[i] - '0';
for (int i = m - 1; ~i; i --) B[l2 ++] = b[i] - '0';
// 进行模拟乘法
for (int i = 0; i < n; i ++)
for (int j = 0; j < m; j ++) {
int dis = i + j;
C[dis] += A[i] * B[j];
}
// 最大的可能位数为 n + m
int l = n + m;
for (int i = 0; i < l; i ++) {
C[i + 1] += C[i] / 10;
C[i] %= 10;
}
// 寻找第一个非零元素
while(l > 1 && C[l - 1] == 0) l --;
for (int i = l - 1; ~i; i --) cout << C[i];
return 0;
}
高精度除法 - 输出商和余数
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
string a;
int A[N], C[N];
int b;
int main() {
cin >> a >> b;
int n = a.size();
for (int i = 0; i < n; i ++) A[i] = a[i] - '0';
int t = 0;
for (int i = 0; i < n; i ++) {
C[i] = (t * 10 + A[i]) / b;
t = (t * 10 + A[i]) % b;
}
int p = 0;
while(C[p] == 0 && p < n - 1) p ++;
for (int i = p; i < n; i ++) cout << C[i];
cout << endl;
cout << t;
return 0;
}
高精度除法 - 保留小数点后几位小数
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main() {
int a, b, n; cin >> a >> b >> n;
cout << a / b << ".";
int t = a % b;
for (int i = 1; i <= n; i ++) {
t *= 10;
cout << t / b;
t %= b;
}
return 0;
}
为什么没有高精度/高精度
之后更,有点长