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

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

相关文章

C语言中%zu的用法解读

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

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一