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

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

相关文章

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al