我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页
我的专栏: \mathcal{{\color{Green} 我的专栏:} } 我的专栏: 《精选文章》《算法》《每日一道编程题》《高精度算法》
文章目录
- 前言
- 高精度计算初始模版
- string 转数组
- int 转数组
- 输出数组
- 加减乘除
- 完整模版代码
- 总结
前言
在C++中,储存数据是我们一般用int,long long等自带的数据结构来实现。
但是如果数据非常非常大,单单使用这些就存不下来了!
这时候,我们就要使用高精度计算了
高精度计算的原理其实就是模拟我们常用的竖式计算,使用数组存储。
高精度计算初始模版
我们可以使用数组A,B,C来存储数据,使用string来输入,代码如下:
#include <bits/stdc++.h>
using namespace std;int A[1005], B[1005], C[1005];
/**/;
int main() {string a,b;cin>>a>>b;/**/;return 0;
}
string 转数组
此时就有人要问了:“喂喂喂 string 跟数组完全不是一回事好吗?”
的确,确实不是一回事,所以我们要写一个函数,叫 s2BIG,传入参数字符串 s 和数组 a,将 s 存入 a 中,其中 a[0] 为长度,代码如下:
void s2BIG(string s, int a[]) {a[0] = s.length();for (int i = 1; i <= a[0]; i++) {a[i] = s[a[0] - i] - '0';}
}
int 转数组
此时又有人要问了:“要是我想要将int类型的数据如上存入数组,请问阁下该如何应对呢?”
这很简单,我们要再写一个函数,叫 i2BIG,传入参数 int 类型的整数 s 和数组 a,代码如下:
void i2BIG(int s, int a[]) {while (s > 0) {a[0]++;a[a[0]] = s % 10;s /= 10;}if (s == 0) {a[0] = 1;}
}
输出数组
有的小伙伴已经按捺不住,想要输出我们存入的数据了。此时我们需要编写一个函数 printBIG,只需导入要输出的数组 a,代码如下:
void printBIG(int a[]) {for (int i = a[0]; i >= 1; i--) {cout << a[i];}cout << endl;
}
加减乘除
你现在已经写完了基础部分,那么现在只需加入加减乘除函数,你就完成了所以的模版代码,所以我干脆一口气全给你算了,注意前两个参数是你给到的数据,后一个是处理完之后数据存放的地方,代码如下:
void addBIG(int a[], int b[], int c[]) {c[0] = max(a[0], b[0]);int carry = 0;for (int i = 1; i <= c[0]; i++) {c[i] = a[i] + b[i] + carry;carry = c[i] / 10;c[i] %= 10;}if (carry == 1) {c[0]++;c[c[0]] = 1;}
}void subBIG(int a[], int b[], int c[]) {c[0] = max(a[0], b[0]);for (int i = 1; i <= c[0]; i++) {c[i] = a[i] - b[i];}for (int i = 1; i <= c[0]; i++) {if (c[i] < 0) {c[i] += 10;c[i + 1]--;}}while (c[c[0]] == 0 && c[0] > 1) {c[0]--;}
}void mulBIG(int a[], int b, int c[]) {c[0] = a[0];for (int i = 1; i <= c[0]; i++) {c[i] = a[i] * b;}for (int i = 1; i <= c[0]; i++) {c[i + 1] += c[i] / 10;c[i] %= 10;if (c[c[0] + 1] > 0) {c[0]++;}}
}void divBIG(int a[], int k, int c[]) {int r = 0;for (int i = a[0]; i >= 1; i--) {c[i] = a[i] + r * 10;r = c[i] % k;c[i] /= k;}int len = a[0];while (c[len] == 0 && len != 1)len--;c[0] = len;
}
完整模版代码
完整模版代码如下:
#include <bits/stdc++.h>
using namespace std;int A[1005], B[1005], C[1005];void s2BIG(string s, int a[]) {a[0] = s.length();for (int i = 1; i <= a[0]; i++) {a[i] = s[a[0] - i] - '0';}
}void i2BIG(int s, int a[]) {while (s > 0) {a[0]++;a[a[0]] = s % 10;s /= 10;}if (s == 0) {a[0] = 1;}
}void printBIG(int a[]) {for (int i = a[0]; i >= 1; i--) {cout << a[i];}cout << endl;
}void addBIG(int a[], int b[], int c[]) { // 加法c[0] = max(a[0], b[0]);int carry = 0;for (int i = 1; i <= c[0]; i++) {c[i] = a[i] + b[i] + carry;carry = c[i] / 10;c[i] %= 10;}if (carry == 1) {c[0]++;c[c[0]] = 1;}
}void subBIG(int a[], int b[], int c[]) { // 减法c[0] = max(a[0], b[0]);for (int i = 1; i <= c[0]; i++) {c[i] = a[i] - b[i];}for (int i = 1; i <= c[0]; i++) {if (c[i] < 0) {c[i] += 10;c[i + 1]--;}}while (c[c[0]] == 0 && c[0] > 1) {c[0]--;}
}void mulBIG(int a[], int b, int c[]) { // 乘法c[0] = a[0];for (int i = 1; i <= c[0]; i++) {c[i] = a[i] * b;}for (int i = 1; i <= c[0]; i++) {c[i + 1] += c[i] / 10;c[i] %= 10;if (c[c[0] + 1] > 0) {c[0]++;}}
}void divBIG(int a[], int k, int c[]) { // 除法int r = 0;for (int i = a[0]; i >= 1; i--) {c[i] = a[i] + r * 10;r = c[i] % k;c[i] /= k;}int len = a[0];while (c[len] == 0 && len != 1)len--;c[0] = len;
}int main() {string a,b;cin>>a>>b;s2BIG(a,A);s2BIG(b,B);return 0;
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了高精度的使用,高精度可以让你忽视以后所有题目的数据大小。