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

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

一、欣赏结果

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

复制代码
高精度加法事例
输入第一个加数: 49837295871039
输入第二个加数: 39487219029837
结果是: 89324514900876

高精度减法事例
输入被减数: 1398737632984812
输入减数: 98763498
结果是: 1398737534221314

二、什么是高精度数

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

三、输入

题目描述

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

提示

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

参考答案

cpp 复制代码
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
   char num1[505] = {};
   char num2[505] = {};
   cin >> num1 >> num2;
   cout << num1 << endl << num2;
   return 0;
}

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

cpp 复制代码
// 存储的整型数组
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. 得到加的次数

cpp 复制代码
int len_ans = max(len_num1, len_num2);

2. 遍历做加法

(1) 没有进位时
cpp 复制代码
#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) 有进位时完善后的代码
cpp 复制代码
#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;
}

附录

高精度减法

cpp 复制代码
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
}

完整代码

cpp 复制代码
#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;
}

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


完整代码整理

完整代码总结获取入口


相关推荐
0和1的舞者12 分钟前
《Git:从入门到精通(八)——企业级git开发相关内容》
大数据·开发语言·git·搜索引擎·全文检索·软件工程·初学者
liulilittle27 分钟前
LwIP协议栈MPA多进程架构
服务器·开发语言·网络·c++·架构·lwip·通信
moonsims29 分钟前
Z3 Technology-适用于无人机和机器人的 4K 高清摄像机和视频编码器
算法
摘星编程37 分钟前
深入浅出 Tokio 源码:掌握 Rust 异步编程的底层逻辑
网络·算法·rust·系统编程·tokio
水淹萌龙41 分钟前
玩转 Go 表达式引擎:expr 实战指南
开发语言·后端·golang
艾莉丝努力练剑1 小时前
【C++:继承】面向对象编程精要:C++继承机制深度解析与最佳实践
开发语言·c++·人工智能·继承·c++进阶
penguin_bark1 小时前
C++ 异步编程(future、promise、packaged_task、async)
java·开发语言·c++
小龙报1 小时前
《数组和函数的实践游戏---扫雷游戏(基础版附源码)》
c语言·开发语言·windows·游戏·创业创新·学习方法·visual studio
又是忙碌的一天1 小时前
Java基础 与运算
java·开发语言
Hard_Liquor1 小时前
Datawhale秋训营-“大运河杯”数据开发应用创新大赛
人工智能·深度学习·算法