当前位置: 首页 > news >正文

GESP5级C++考试语法知识(四、高精度计算(一)加法和减法)


一、为什么需要高精度计算?

故事前言 🌟

1、在数字王国里,有两位巨人:

A = 987654321987654321 B = 123456789123456789

2、他们想相加:

987654321987654321 +123456789123456789

3、但是C++普通的整数:

int 最大约 21亿 long long 最大约 9e18

4、如果数字更大:

100000000000000000000000000

所有数字的数据类型都装不下


5、怎么办?

于是程序员发明了一种办法:

用数组,一位一位存数字


6、这就叫

数组模拟高精度


二、数组如何存一个大整数?

1、例如这个数:

1234567890123456789

2、如果用数组存,我们有两种选择:

(1)方法1(很难处理)

a[0] = 1 a[1] = 2 a[2] = 3 ...

(2)问题:

计算加法时必须从最后算,最后的位置不确定!

十分不方便。


(3)方法2(高精度标准方法)

倒着存!

数字: 1 2 3 4 5 6 7 8 9 数组: 9 8 7 6 5 4 3 2 1 下标: 0 1 2 3 4 5 6 7 8

(4)也就是

个位存在 a[0] 十位存在 a[1] 百位存在 a[2]

(5)这样做的好处:

因为我们算加法每次都是:

个位 → 十位 → 百位

所以数组的从0开始的顺序刚刚好。


三、如何把字符串变成数组

1、输入:

12345

2、存入数组:

a[0] = 5 a[1] = 4 a[2] = 3 a[3] = 2 a[4] = 1

3、代码:

string s; cin >> s; for(int i = 0; i < s.size(); i++) { a[i] = s[s.size()-1-i] - '0'; }

4、解释:

字符 '5' - '0' = 5 字符 '4' - '0' = 4

四、高精度加法

1、我们算:

1234 +5678

2、正常竖式:

1234 + 5678 ------- 6912

3、计算顺序:

个位 → 十位 → 百位 → 千位

4、用数组表示

a = 4 3 2 1 b = 8 7 6 5

五、加法计算的步骤

我们逐位计算:

第1步

4 + 8 = 12

写:

2

进位:

1

第2步

3 + 7 + 1 = 11

写:

1

进位:

1

第3步

2 + 6 + 1 = 9

写:

9

第4步

1 + 5 = 6

写:

6

结果:

6 9 1 2

六、进位什么时候处理?

1、这是很多初学者容易疑惑的问题。

我们推荐的方法是:

每算一位就处理进位


2、步骤:

sum = a[i] + b[i] + carry

3、然后:

当前位 = sum % 10 进位 = sum / 10

七、高精度加法参考代码

#include <iostream> using namespace std; int a[1000], b[1000], c[1000]; int main() { string s1, s2; cin >> s1 >> s2; int len1 = s1.size(); int len2 = s2.size(); // 倒序存入数组 for(int i = 0; i < len1; i++) a[i] = s1[len1-1-i] - '0'; for(int i = 0; i < len2; i++) b[i] = s2[len2-1-i] - '0'; int len = max(len1, len2); int carry = 0; for(int i = 0; i < len; i++) { int sum = a[i] + b[i] + carry; c[i] = sum % 10; // 当前位 carry = sum / 10; // 进位 } if(carry) { c[len] = carry; len++; } for(int i = len-1; i >= 0; i--) cout << c[i]; return 0; }

八、高精度减法

1、例如:

5110 -1234

2、竖式:

5110 - 1234 ------ 3876

九、借位规则

1、例如:

0 - 4

不够减。

怎么办?


2、向前一位借:

10 - 4 = 6

3、前一位减少:

1 → 0

十、借位过程

例:

5110 -1234

数组:

a = 0 1 1 5 b = 4 3 2 1

第1位

0 - 4

借位:

10 - 4 = 6

前一位减1


第2位

0 - 3

借位:

10 - 3 = 7

第3位

0 - 2

借位:

10 - 2 = 8

第4位

4 - 1 = 3

结果

3876

十一、减法代码

1、假设:

A >= B

2、参考代码:


#include <iostream> using namespace std; int a[1000], b[1000], c[1000]; int main() { string s1, s2; cin >> s1 >> s2; int len1 = s1.size(); int len2 = s2.size(); for(int i = 0; i < len1; i++) a[i] = s1[len1-1-i] - '0'; for(int i = 0; i < len2; i++) b[i] = s2[len2-1-i] - '0'; int len = len1; for(int i = 0; i < len; i++) { if(a[i] < b[i]) { a[i] += 10; a[i+1]--; } c[i] = a[i] - b[i]; } while(len > 1 && c[len-1] == 0) len--; for(int i = len-1; i >= 0; i--) cout << c[i]; return 0; }

十二、高精度加减法万能模板

1、比赛常用结构:

1 读入字符串 2 倒序存入数组 3 从低位开始计算 4 每一位处理进位 / 借位 5 输出时倒序打印

2、口诀:

高精度计算四步骤 字符串读入 倒序存储 逐位运算 倒序输出

十三、小学生记忆口诀

1、高精度加法口诀:

一位一位慢慢加 加完立刻处理它 个位放余数 十位当进位

2、高精度减法口诀:

不够减就借一位 借完加十再去减

十四、课堂练习题

题1 高精度加法

输入

123456789123456789 987654321

输出

123457776777777110

题2 高精度减法

输入

1000000000000000000 1

输出

999999999999999999

http://www.jsqmd.com/news/477980/

相关文章:

  • Linux下hadoop2.9.2单节点伪分布搭建完全教程
  • InstructPix2Pix应用全解析:从风景优化到人像精修,小白也能轻松上手
  • 垂直泊车(带Matlab可调参)
  • SEER‘S EYE 一键部署后,如何通过Git进行版本管理与协作开发
  • SQL 窗口函数 学习笔记
  • R提供了一些函数用于判断逻辑表达式的结果
  • C++面试总结(1)
  • MacBook + 台式机如何共享双屏?KVM切换器是终极答案|附TESmart全系对比推荐
  • 深入解析桥接模式:一个C++模板实现的通用桥接类库
  • 统信UOS 20 高效部署实战指南
  • 机械臂轨迹规划是机器人开发中的重头戏,今天咱们用Matlab的Robotics Toolbox带PUMA560走两步。先给机械臂充个电——初始化模型
  • 报错v-bind is missing expression
  • 局部遮阴光伏MPPT仿真:粒子群算法详解及视频解析
  • Multisim仿真TL494BUCK闭环,稳定输出5v,带软启动。 电流限制为0.14A电流...
  • 从时序建模到寿命预测:TCN在轴承RUL预测中的实战解析
  • k8s工作负载-HPA控制器
  • 【Docker】Linux系统上卸载旧Docker、卸载Podman并重新安装Docker及配置国内镜像源
  • 基于二次规划的路径规划与速度规划:从MATLAB到C++的实践
  • 又崩了?C++的灵活,新手的坑,老手的泪,高手都没控制就泄漏了
  • 2026做媒介宣发,真没必要再求人找关系了
  • LTspice仿真学习指南:掌握LDO模拟集成电路电源及其关键仿真技巧(包括相位裕度等)
  • 周期 Pattern Removal 算法
  • OpenClaw 技能插件开发实战:适配职业教育的 AI 实训案例
  • 10kW虚拟同步发电机(VSG)小信号稳定控制matlab仿真 【985双一流专业的电气工程博...
  • 调速器响应,0.05秒级延迟
  • 我收藏的一个非常详细的CTF挑战赛题库,建议收藏!
  • 麻雀算法的逆袭:RSSA实战解析
  • 傅里叶变换
  • 光伏MPPT电导增量法仿真模型及配套视频
  • GEE平台下Landsat时序RSEI计算与生态演变分析