C++知识点总结(5):高精度加减法

编程入门 行业动态 更新时间:2024-10-19 12:46:33

C++知识点总结(5):高精度<a href=https://www.elefans.com/category/jswz/34/1765971.html style=加减法"/>

C++知识点总结(5):高精度加减法

我们将这个问题拆解成几个步骤,来完成结果。

一、欣赏结果

先来欣赏一下完成后的运行的结果:

高精度加法事例
输入第一个加数: 49837295871039
输入第二个加数: 39487219029837
结果是: 89324514900876高精度减法事例
输入被减数: 1398737632984812
输入减数: 98763498
结果是: 1398737534221314

二、什么是高精度数

  • 【含义】无法使用基础类型存储的数字。
  • 【存储】这里使用char数组,更稳定一些。

三、输入

题目描述

输入两个高精度数(不超过10^500),并输出两个高精度数。

提示

数组的长度直接用505即可,别看10500很大,其实只有501位。

参考答案

#include <iostream>
#include <cstring>
using namespace std;int main()
{char num1[505] = {};char num2[505] = {};cin >> num1 >> num2;cout << num1 << endl << num2;return 0;
}

四、转换为整型&倒序存储

// 存储的整型数组
int num1_int[505] = {};
int num2_int[505] = {};// 取两个数字的长度
int len_num1 = strlen(num1);
int len_num2 = strlen(num2);// 遍历存储
for (int i = 0; i <= len_num1-1; i++)num1_int[len_num1-i-1] = num1[i] - 48;
for (int i = 0; i <= len_num2-1; i++)num2_int[len_num2-i-1] = num2[i] - 48;

五、计算

1. 得到加的次数

int len_ans = max(len_num1, len_num2);

2. 遍历做加法

(1) 没有进位时
#include <iostream>
#include <cstring>
using namespace std;int main()
{char num1[505] = {};char num2[505] = {};cin >> num1 >> num2;// 存储的整型数组int num1_int[505] = {};int num2_int[505] = {};// 取两个数字的长度int len_num1 = strlen(num1);int len_num2 = strlen(num2);// 遍历存储for (int i = 0; i <= len_num1-1; i++){num1_int[len_num1-i-1] = num1[i] - 48;}for (int i = 0; i <= len_num2-1; i++){num2_int[len_num2-i-1] = num2[i] - 48;}// 存储运算结果int len_ans = max(len_num1, len_num2);int ans[505] = {};for (int i = 0; i <= len_ans-1; i++){ans[i] = num1_int[i] + num2_int[i];}// 倒序输出运算结果for (int i = len_ans-1; i >= 0; i--){cout << ans[i];}return 0;
}
(2) 有进位时完善后的代码
#include <iostream>
#include <cstring>
using namespace std;int main()
{char num1[505] = {};char num2[505] = {};cin >> num1 >> num2;// 存储的整型数组int num1_int[505] = {};int num2_int[505] = {};// 取两个数字的长度int len_num1 = strlen(num1);int len_num2 = strlen(num2);// 遍历存储for (int i = 0; i <= len_num1-1; i++){num1_int[len_num1-i-1] = num1[i] - 48;}for (int i = 0; i <= len_num2-1; i++){num2_int[len_num2-i-1] = num2[i] - 48;}// 计算int len_ans = max(len_num1, len_num2);int ans[505] = {};int in = 0;for (int i = 0; i <= len_ans-1; i++){ans[i] = num1_int[i] + num2_int[i] + in;in = ans[i] / 10; // 进位的结果ans[i] %= 10; // 存储真实结果的最后一位}// 特例先行if (in > 0){ans[len_ans] = in;len_ans++;}for (int i = len_ans-1; i >= 0; i--){cout << ans[i];}return 0;
}

附录

高精度减法

int ans[505] = {};
int len_ans = len_num1; // 默认大数-小数
for (int i = 0; i <= len_ans-1; i++)
{if (num1_int[i] < num2_int[i]) // 借位的情况{num1_int[i+1]--; // 借一num1_int[i] += 10; // 加10}ans[i] = num1_int[i] - num2_int[i]; // 减法
}// 输出前写下面的代码
while(ans[len_ans-1] == 0 && len_ans > 1) // 最高位的情况,前导0且结果非0的情况
{len_ans--; // 减少,后面不会输出前面的0
}

完整代码

#include <iostream>
#include <cstring>
using namespace std;int main()
{char num1[505] = {};char num2[505] = {};cin >> num1 >> num2;// 存储的整型数组int num1_int[505] = {};int num2_int[505] = {};// 取两个数字的长度int len_num1 = strlen(num1);int len_num2 = strlen(num2);// 遍历存储for (int i = 0; i <= len_num1-1; i++){num1_int[len_num1-i-1] = num1[i] - 48;}for (int i = 0; i <= len_num2-1; i++){num2_int[len_num2-i-1] = num2[i] - 48;}// 计算int ans[505] = {};int len_ans = len_num1; // 默认大数-小数for (int i = 0; i <= len_ans-1; i++){if (num1_int[i] < num2_int[i]) // 借位的情况{num1_int[i+1]--; // 借一num1_int[i] += 10; // 加10}ans[i] = num1_int[i] - num2_int[i]; // 减法}// 输出前写下面的代码while(ans[len_ans-1] == 0 && len_ans > 1) // 特例先行{len_ans--; // 不会输出前面的0了}for (int i = len_ans-1; i >= 0; i--){cout << ans[i];}return 0;
}

需要所有完整代码,进入:


完整代码整理

完整代码总结获取入口


更多推荐

C++知识点总结(5):高精度加减法

本文发布于:2023-11-15 06:11:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1595039.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:加减法   知识点

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!