【高精度】高精加法/减法/乘法/除法模板合集+解读

2024-04-22 00:52

本文主要是介绍【高精度】高精加法/减法/乘法/除法模板合集+解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

高精度加减乘除

注意:因为高精度的加法/减法/乘法都是反向读取,处理最低位,所以为了保持统一,高精度的除法也采用了反向的输入模式。

(付费 ) 练习链接

  • 高精度加法
  • 高精度减法
  • 高精度乘法
  • 高精度除法

前言:由于高精度本质就是小学的四则运算,所以本文主要以展示模板为主要目的。

高精度加法

#include <iostream>
#include <vector>
using namespace std;vector<int> add(vector<int>& A, vector<int>& B) {vector<int> C;int t = 0;for (int i = 0; i < A.size() || i < B.size(); i++) {if (i < A.size()) t += A[i];if (i < B.size()) t += B[i];C.push_back(t % 10);t /= 10;}if (t) C.push_back(1);return C;
}int main() {vector<int> A, B, C;    string a, b;cin >> a >> b;for (int i = a.size() - 1; i >= 0; i--) {A.push_back(a[i] - '0');}for (int i = b.size() - 1; i >= 0; i--) {B.push_back(b[i] - '0');}C = add(A, B);for (int i = C.size() - 1; i >= 0; i--) {cout << C[i];}return 0;
}

注意点:

  1. 反向读取,便于从最低位开始运算
  2. 使用t保存每一次的进位
  3. 最后补上最高位

高精度减法

#include <iostream>
#include <vector>using namespace std;bool cmp(vector<int>& A, vector<int>& B) {if (A.size() != B.size()) {return A.size() > B.size();} else {for (int i = A.size() - 1; i >= 0; i--) {if (A[i] != B[i]) return A[i] > B[i];}}return true;
}vector<int> sub(vector<int>& A, vector<int>& B) {vector<int> C;// 必须保证A > B才可以使用本模板for (int i = 0, t = 0; i < A.size(); i ++) {t = A[i] - t;if (i < B.size()) t -= B[i];C.push_back((t + 10) % 10);if (t < 0) t = 1;else t = 0;}while (C.size() > 1 && C.back() == 0) C.pop_back();return C;
}int main() {vector<int> A, B, C;string a, b;cin >> a >> b;for (int i = a.size() - 1; i >= 0; i--) {A.push_back(a[i] - '0');}for (int i = b.size() - 1; i >= 0; i--) {B.push_back(b[i] - '0');}if (cmp(A, B)) {C = sub(A, B);for (int i = C.size() - 1; i >= 0; i--) {cout << C[i];}} else {C = sub(B, A);cout << '-';for (int i = C.size() - 1; i >= 0; i--) {cout << C[i];}}
}

注意点:

  1. 同样是反向读取,从最低开始运算
  2. 使用t保存借位,每次进位扣除借位
  3. 最后去掉所有的前导零
  4. 必须保证A > B,如果是A < B那么问题其实可以转换为**- (B - A)**

高精度乘法

#include <iostream>
#include <vector>using namespace std;int b;
string a;
vector<int> A;vector<int> multi(vector<int>& A, int b) {int t = 0;vector<int> C;for (int i = 0; i < A.size() || t; i ++) {if (i < A.size()) t += A[i] * b;C.push_back(t % 10);t /= 10;}while (C.back() == 0 && C.size() > 1) C.pop_back();return C;
}int main() {cin >> a >> b;for (int i = a.size() - 1; i >= 0; i --) {A.push_back(a[i] - '0');}auto C = multi(A, b);for (int i = C.size() - 1; i >= 0; i --) cout << C[i];return 0;
}

注意点:

  1. 使用t存储进位
  2. 最后同样不要忘记去掉前导零
  3. 这里的循环结束条件中的|| t,其实和高精度加法最后补上最高位本质上是一个功能,只是实现方式有略微差别s

高精度除法

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;string a;
int b, r;
vector<int> A;vector<int> div(vector<int> A, int b, int& r) {vector<int> C;for (int i = A.size() - 1; i >= 0; i --) {r= r * 10 + A[i];C.push_back(r / b);r %= b;}// 第一种写法:// reverse(C.begin(), C.end());// while (C.size() > 1 && C.back() == 0) C.pop_back();// reverse(C.begin(), C.end());// 我的写法:while (C.size() > 1 && C[0] == 0) C.erase(C.begin());return C;
}int main() {cin >> a >> b;for (int i = a.size() - 1; i >= 0; i --) {A.push_back(a[i] - '0');}auto C = div(A, b, r);for (int i = 0; i < C.size(); i ++ ) {cout << C[i];}cout << endl << r;return 0;
}

注意点:

  1. 为了保持输入结构的一致性(协同加减乘),也使用反向读取(其实可以不用),所以在函数中再次反向读取从而从最高位开始计算
  2. 最后不要忘记去掉前导零

这篇关于【高精度】高精加法/减法/乘法/除法模板合集+解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924460

相关文章

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

MySQL之搜索引擎使用解读

《MySQL之搜索引擎使用解读》MySQL存储引擎是数据存储和管理的核心组件,不同引擎(如InnoDB、MyISAM)采用不同机制,InnoDB支持事务与行锁,适合高并发场景;MyISAM不支持事务,... 目录mysql的存储引擎是什么MySQL存储引擎的功能MySQL的存储引擎的分类查看存储引擎1.命令

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

MySQL8.0临时表空间的使用及解读

《MySQL8.0临时表空间的使用及解读》MySQL8.0+引入会话级(temp_N.ibt)和全局(ibtmp1)InnoDB临时表空间,用于存储临时数据及事务日志,自动创建与回收,重启释放,管理高... 目录一、核心概念:为什么需要“临时表空间”?二、InnoDB 临时表空间的两种类型1. 会话级临时表

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示