领略算法真谛:高精度
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!
我的博客:yuanManGan
本章仅实现高精度加法,其他方法类似,博主将以题山采玉专题实现高精度减法,乘法,除法。
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];
}
快去试试吧,完结撒花!
原文地址:https://blog.csdn.net/yuanManGan/article/details/145093933
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!