自学内容网 自学内容网

领略算法真谛:高精度

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的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];

}

快去试试吧,完结撒花!


原文地址:https://blog.csdn.net/yuanManGan/article/details/145093933

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!