嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!
我的博客:yuanManGan
我的专栏:C++入门小馆 C言雅韵集 数据结构漫游记 闲言碎语小记坊 题山采玉
本章仅实现高精度加法,其他方法类似,博主将以题山采玉专题实现高精度减法,乘法,除法。
int类型能存储10^9的数,long long 类型能存储10^18的数
而如果我们遇到要求计算与10^1000次方的数相关的时那该如何是好呢?
高精度加法
高精度讲解
如果我们要实现高精度加法,很明显不能用int,和longlong,但如果我们把这样一个很大的数当成一个字符串读入,然后将它们分别存储在一个数组中,问题就变得简单起来了。但这里我们要注意,我们将字符串存储在数组中时要逆序存储,先存储低位,因为低位相加高位要进一,我们是模拟画竖式计算的
如我们要实现 985 + 288
.
我们一位一位计算时要记得判断是否大于10,
大于10让下一位进一
同时自己这位%10
例题 洛谷P1601 A+B Problem(高精)
代码实现
定义
const int N = 1e5 + 10;
int a[N], b[N], c[N];
int la, lb, lc;
这里定义的全是全局变量,方便不用初始化,数组a,b代存储的是两个加数逆序存储后的一个一个位 (由低位到高位存储)而数组c存储的是a加b的和
la,lb,lc是数组abc的大小(有效存储个数);
主函数
int main()
{string s1, s2; cin >> s1 >> s2;la = s1.size(), lb = s2.size(), lc = max(la, lb);for (int i = 0; i < la; i++) a[la - 1 - i] = s1[i];for (int i = 0; i < lb; i++) b[lb - 1 - i] = s2[i];Add();for (int i = lc - 1; i >= 0; i--) cout << c[i];}
这里的Add函数之后实现,先把函数框架写出来。
答案的长度一定是a和b中最长的,但也有可能还要长一位,这里之后讨论
for (int i = 0; i < la; i++) a[la - 1 - i] = s1[i] - '0';
for (int i = 0; i < lb; i++) b[lb - 1 - i] = s2[i] - '0';
注意这里s1和s2里面存储的是字符所以要- ' 0 '.
这里逆序存储时,我们可以画图理解一下。
我们发现了一个规律,一个数它在s1和a的下标之和是个定值,为a的长度的 -1,
所以就很容易发现,在s1中i下标的位置需要存储 在a的la-1-n之中。
Add函数
void Add()
{for (int i = 0; i < lc; i++)//枚举每一位{c[i] += a[i] + b[i];if (c[i] / 10){c[i + 1]++;c[i] %= 10;}}if (c[lc]) lc++;
}
这里就很简单了。
最后这里但最高位还有时,lc++,打印时最后会多打一位。
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;const int N = 1e5 + 10;
int a[N], b[N], c[N];
int la, lb, lc;void Add()
{for (int i = 0; i < lc; i++)//枚举每一位{c[i] += a[i] + b[i];if (c[i] / 10){c[i + 1]++;c[i] %= 10;}}if (c[lc]) lc++;
}
int main()
{string s1, s2; cin >> s1 >> s2;la = s1.size(), lb = s2.size(), lc = max(la, lb);for (int i = 0; i < la; i++) a[la - 1 - i] = s1[i] - '0';for (int i = 0; i < lb; i++) b[lb - 1 - i] = s2[i] - '0';Add();for (int i = lc - 1; i >= 0; i--) cout << c[i];}
快去试试吧,完结撒花!