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

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

相关文章

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

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

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

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

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

解读@ConfigurationProperties和@value的区别

《解读@ConfigurationProperties和@value的区别》:本文主要介绍@ConfigurationProperties和@value的区别及说明,具有很好的参考价值,希望对大家... 目录1. 功能对比2. 使用场景对比@ConfigurationProperties@Value3. 核

Jupyter notebook安装步骤解读

《Jupyternotebook安装步骤解读》:本文主要介绍Jupyternotebook安装步骤,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、开始安装二、更改打开文件位置和快捷启动方式总结在安装Jupyter notebook 之前,确认您已安装pytho

Java中的StringUtils.isBlank()方法解读

《Java中的StringUtils.isBlank()方法解读》:本文主要介绍Java中的StringUtils.isBlank()方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录所在库及依赖引入方法签名方法功能示例代码代码解释与其他方法的对比总结StringUtils.isBl

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

对Django中时区的解读

《对Django中时区的解读》:本文主要介绍对Django中时区的解读方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景前端数据库中存储接口返回AI的解释问题:这样设置的作用答案获取当前时间(自动带时区)转换为北京时间显示总结背景设置时区为北京时间 TIM

Java中的内部类和常用类用法解读

《Java中的内部类和常用类用法解读》:本文主要介绍Java中的内部类和常用类用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录内部类和常用类内部类成员内部类静态内部类局部内部类匿名内部类常用类Object类包装类String类StringBuffer和Stri