我的个人主页 {\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;
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了高精度的使用,高精度可以让你忽视以后所有题目的数据大小。