领略算法真谛:高精度

embedded/2025/1/13 16:59:10/

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

快去试试吧,完结撒花!


http://www.ppmy.cn/embedded/153606.html

相关文章

蓝桥杯历届真题 # 数字诗意(C++,Java)

文章目录 题目解读[蓝桥杯 2024 省 C] 数字诗意题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路完整代码 题目解读 原题链接 [蓝桥杯 2024 省 C] 数字诗意 题目描述 在诗人的眼中&#xff0c;数字是生活的韵律&#xff0c;也是诗意的表达。 小蓝&#x…

HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现

HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现 最近在学习鸿蒙开发过程中&#xff0c;阅读了官方文档&#xff0c;在之前做flutter时候&#xff0c;经常使用overlay&#xff0c;使用OverlayEntry加入到overlayState来做添加悬浮按钮、提示弹窗、加载中指示器、加载失败的t…

【Apache Paimon】-- 为什么选择将 Spark 与 Paimon 集成,解决什么问题?

目录 1. 数据湖与数据仓库的融合 2. 高性能流批一体的计算与存储 3. 数据更新与事务一致性保障 4. 高效的 Schema 演进支持 5. 降低数据存储与查询成本 6. 多引擎生态支持 总结:集成的价值 将 Apache Spark 与 Apache Paimon 集成的原因和价值主要体现在以下几个…

代码随想录算法训练营第 4 天(链表 2)| 24. 两两交换链表中的节点19.删除链表的倒数第N个节点 -

一、24. 两两交换链表中的节点 题目&#xff1a;24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 视频&#xff1a;帮你把链表细节学清楚&#xff01; | LeetCode&#xff1a;24. 两两交换链表中的节点_哔哩哔哩_bilibili 讲解&#xff1a;代码随想录 dummy-…

Github 2025-01-10 Java开源项目日报Top8

根据Github Trendings的统计,今日(2025-01-10统计)共有8个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目8TypeScript项目1Kotlin项目1C++项目1JeecgBoot 企业级低代码开发平台 创建周期:2062 天开发语言:Java, Vue协议类型:Apache License…

预编译SQL

预编译SQL 预编译SQL是指在数据库应用程序中&#xff0c;SQL语句在执行之前已经通过某种机制&#xff08;如预编译器&#xff09;进行了解析、优化和准备&#xff0c;使得实际执行时可以直接使用优化后的执行计划&#xff0c;而不需要每次都重新解析和编译。这么说可能有一些抽…

MySQL索引覆盖(覆盖索引, Covering Index)

文章目录 说明MySQL索引覆盖&#xff08;覆盖索引, Covering Index&#xff09;覆盖索引的概念覆盖索引的示例示例查询及索引覆盖情况覆盖索引的性能优势覆盖索引的实现条件覆盖索引 vs 非覆盖索引覆盖索引的限制如何设计覆盖索引覆盖索引的实际案例场景 1&#xff1a;电商系统…

PyQt5按钮类控件Button

一、PushButton 开发中经常会用到的功能&#xff1a; 1.点击。 2.设置默认按钮。 3.设置按钮为可切换状态按钮。 1.方法 方法名称作用备注setText(QString)设置按钮上的文字&#xff0c;参数值为字符串text()获取按钮上的文字setIcon(QIcon)设置按钮icon&…