引言
此篇是专栏信息学杂谈第七篇高精度计算(加 & 减),较详细的讲解了C++中应该如何实现高精度的加减运算
高精度计算
利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度较高,但因受到硬件的限制,往往达不到实际问题所要求的精度。我们可以利用程序设计的方法去实现这样的高精度计算。介绍常用的几种高精度计算的方法。
数据的接收方法和存储方法
当输入的数很长时,可采用宇符串方式输入,这样可输入很长的数,利用字符串函数中操作运算,将每一位数取出,存入数组中。
void init(int a[]) { //传入一个数组string s;cin >> s; //读入字符串sint lens = s.size();for (int i = 0; i < lens; i++) {a[i] = s[lens - 1 - i] - '0'; //将数串s转换为数组a,并倒序存储}
}
例:
如果我们用数组A、B分别存储加数和被加数,用数组C存储结果。
则上例有A[1]=6,A[2]=5, A[3]-8,B[1]=5, B[2]=5, B[3]=2, C[4]=1, C[3]=1,C[2]=1,C[1]=1 两数相加如下图近示
确定位数
接收时往往是用字符串的,所以它的位数就等于字符串的长度
运算
- 加法进位:
c[i] += a[i] + b[i];
if (c[i] >= 10) {c[i] %= 10;c[i + 1]++;
}
完整代码:
#include <iostream>
using namespace std;
int main() {ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);//快读string s1, s2, str;int a[10000], b[10000], c[100001];cin >> s1 >> s2;int len1 = (int) s1.length(), len2 = (int) s2.length();// 反向存储for (int i = 0; i < len1; i++) {a[i] = s1[len1 - i - 1] - '0';}for (int i = 0; i < len2; i++) {b[i] = s2[len2 - i - 1] - '0';}// 计算int len = max(len1, len2);for (int i = 0; i < len; i++) {c[i] += a[i] + b[i];if (c[i] >= 10) {c[i] %= 10;c[i + 1]++;}}// 删除前导0while (c[len] == 0 && len > 0) {len--;}//反向存储for (int i = len; i >= 0; i--) {str += to_string(c[i]);}cout << str;//输出return 0;
}
- 减法借位:
if (a[i] < b[i]) {a[i + 1]--;a[i] += 10;
}
c[i] = a[i] - b[i];
完整代码:
#include <iostream>
using namespace std;
int main() {ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);//快读string s1, s2, str;int a[10000], b[10000], c[100001];cin >> s1 >> s2;int len1 = (int) s1.length(), len2 = (int) s2.length();if (len1 < len2 || (len1 == len2 && s1 < s2)) {//若整数s1 < s2,先打印负号,再交换swap(s1, s2);// 交换swap(len1, len2);cout << '-';}// 反向存储for (int i = 0; i < len1; i++) {a[i] = s1[len1 - i - 1] - '0';}for (int i = 0; i < len2; i++) {b[i] = s2[len2 - i - 1] - '0';}// 计算int len = max(len1, len2);for (int i = 0; i < len; i++) {if (a[i] < b[i]) {a[i + 1]--;a[i] += 10;}c[i] = a[i] - b[i];}// 删除前导0while (c[len] == 0 && len > 0) {len--;}//反向存储for (int i = len; i >= 0; i--) {str += to_string(c[i]);}cout << str;//输出return 0;
}
完结!
Tip:为了获得更深入的学习体验,请参考相关教程或书籍,了解C++语言的更多基本结构和基本语法。
每篇图片分享
图片来自inscode上的开源程序
濒危动物:巴西犰狳