【算法基础】高精度运算

文章目录

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


高精度加法

主要思路就是利用编程模拟人工的加法
方便操作使用vector来存储这些数
为了方便进位,需要将原数字倒过来存储到vector中
加完所有位之后别忘了判断最后一位的进位
最后需要将vector中的数倒着输出

#include<iostream>
#include<string>
#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 > 0) C.push_back(t);return C;
}int main(){string a, b;vector<int> A, B;cin >> a >> b;for(int i = a.size()-1; i >= 0; i--) A.push_back(a[i]-'0'); //倒着将数存入vectorfor(int i = b.size()-1; i >= 0; i--) B.push_back(b[i]-'0');auto C = add(A, B);//倒着输出for(int i = C.size()-1; i >= 0; i--){cout << C[i];}return 0;
}

高精度减法

存储方式与高精度加法一样
在减操作前,先判断a,b的大小,都转换成大数-小数的形式,如果结果是负数,先输出一个负号
对于每一位的操作,都是:减数-被减数-借位
每次需要判断被减数是否有对应的这一位,没有就用0代替
借位初始化为0,在每次操作后,如果得到的是负数,借位就是1,否则就是0
每一位的得数有两种情况,t<0, t>=0
如果t>0得数就是t,否则得数是t+10
最后倒着输出结果即可


#include<iostream>
#include<vector>
#include<string>
using namespace std;//A >= B
bool cmp(vector<int> &A, vector<int> &B){if(A.size() < B.size()) return false;else if(A.size() == B.size()){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;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;}//去除前导0 注意留1位while(C.size() > 1 && C.back() == 0) C.pop_back();return C;
}int main(){string a, b;vector<int> 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');vector<int> C;if(cmp(A, B)) C = sub(A, B);else C = sub(B, A), cout << "-";for(int i = C.size()-1; i >= 0; i--) cout << C[i];return 0;
}

高精度乘法

存储方式和前面一样,只是这里的相乘方式和手算的方式不一样
这里需要将乘数的每一位分别与被乘数相乘加上这一位的进位
每一位的相乘结果为t,则t%10为得数的相应位的数,t/10为进位的数

#include<iostream>
#include<string>
#include<vector>
using namespace std;vector<int> mul(vector<int> &A, int b){vector<int> C;for(int i = 0, t = 0; i < A.size() || t; i++){if(i < A.size()) t += A[i] * b;C.push_back(t % 10);t /= 10;}while(C.size() > 1 && C.back() == 0) C.pop_back();  //如果全是乘0,所有位数都是0return C;
}int main(){string a;int b;cin >> a;cin >> b;vector<int> A;for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i]-'0');vector<int> C = mul(A, b);for(int i = C.size() - 1; i >= 0; i--) cout << C[i];cout << endl; return 0;
}

高精度除法

除法与前面的几种高精度运算都不太一样的地方在于
数据的存储方式,这里需要从除数的最高位开始运算,所以得到的数字也是从高位开始的
这里只需要将运算完的vector去除前导0之后reverse一下即可

做除法运算时,首先需要将上次除法得到的余数*10+下一位数字作为除数
然后除数/被除数得到商
除数%被除数得到这次运算的余数
最后的余数就是整个除法运算的余数

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;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();return C;
}int main(){string a;int b;cin >> a;cin >> b;vector<int> A;for(int i = a.size()-1; i >= 0; i--) A.push_back(a[i]-'0');int r = 0;vector<int> C = div(A, b, r);for(int i = C.size() - 1; i >= 0; i--) cout << C[i];cout << endl << r << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/151031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习算法项目开发流程

机器学习算法是当今人工智能领域最重要的技术之一&#xff0c;它可以让计算机通过学习数据中的模式和规律来实现预测和决策。在实际应用中&#xff0c;开发一个成功的机器学习算法项目需要遵循一定的开发流程。本文将介绍一个常见的机器学习算法项目开发流程&#xff0c;帮助读…

odoo16前端框架源码阅读——env.js

env.js&#xff08;env的初始化以及服务的加载&#xff09; 路径&#xff1a;addons\web\static\src\env.js 这个文件的作用就是初始化env&#xff0c;主要是加载所有的服务。如orm, title, dialog等。 1、env.js 的加载时机 前文我们讲过前端的启动函数&#xff0c;start.…

系统安全测试详解

一、前言 我刚开始接触安全测试的时候&#xff0c;想的最多就说那种在昏暗的灯光下&#xff0c;带着神秘面具的黑客&#xff0c;对着键盘噼里啪啦一顿猛如虎的操作&#xff0c;然后长舒一口气&#xff0c;最后来了句yes&#xff0c;完美收工&#xff01; 随后的职业生涯中&am…

LaTex 空行

在LaTeX中&#xff0c;可以通过命令\vspace{\baselineskip}或者使用\bigskip来插入一个空行。 以下是示例代码&#xff1a; 这是一段文字。\vspace{\baselineskip}这是下一段文字。或者&#xff1a; 这是一段文字。\bigskip这是下一段文字。

你是否了解Spring @EventListener注解?

当创建一个大型的应用程序时&#xff0c;我们经常需要处理各种事件。Spring框架提供了一个强大的事件处理机制&#xff0c;允许我们在应用程序中定义和监听事件。其中&#xff0c;EventListener注解是Spring框架中用于监听事件的主要注解之一。在本篇博客中&#xff0c;我们将深…

Django学习日志08

如何开启事务 事务的目的&#xff1a;为了保证多个SQL语句执行成功&#xff0c;执行失败&#xff0c;前后保持一致&#xff0c;保证数据安全 ACID属性&#xff1a; A&#xff1a;原子性&#xff08;Atomicity&#xff09;&#xff1a;指事务是原子的&#xff0c;对事务中的操…

Mysql 索引与事务

1. 索引 1.1 什么是索引 当我们看一本书时可以通过目录快速的定位到我们想要的章节 &#xff0c;在数据库中查询数据也需要遍历表&#xff0c;而且数据库是把数据存储在硬盘上的&#xff0c;所以读取数据十分的慢&#xff0c;因此就可以给数据库引入索引&#xff0c;提高查询…

python数据可视化之matplotlib.pyplot

文章目录 模块引用折线条图实际应用案例关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 不论是数据挖掘还是数据…

Hadoop-- hdfs

1、HDFS中的三个进程&#xff1a;NameNode&#xff08;NN&#xff09;、DataNode(DN)、SecondNameNode(SNN) 2、NameNode&#xff08;NN&#xff09; 1、作用&#xff1a; 1、接收客户端的一个读、写的服务&#xff0c;在namenode上存储了数据文件和datanode的映射的关系。 …

移动云电脑:摆脱传统桎梏,助推企业数字化转型

如今&#xff0c;随着“云”在企业数字化转型战略中的作用日益凸显&#xff0c;上云是企业数字化转型第一步&#xff0c;已成为业界共识。尤其对于中小企业而言&#xff0c;数字化转型更是一种生存之道。 实际上&#xff0c;企业数字化转型面临很多传统桎梏。例如&#xff0c;数…

企业数字化转型的好处?_光点科技

企业数字化转型是当今商业世界中一个至关重要的议题。数字化转型不仅仅意味着采用新技术&#xff0c;而是涉及到企业在文化、运营和客户体验方面的根本变革。那么&#xff0c;企业数字化转型的好处是什么呢&#xff1f; 1.数字化转型可以显著提高企业的运营效率。 通过自动化流…

Hafnium之分区运行时模型

端点的运行时模型描述了执行上下文在不同状态之间允许的转换。下面是支持的四种分区运行时模型(请参阅[1]第7节): RTM_FFA_RUN:呈现给执行上下文的运行时模型,该执行上下文通过FFA_RUN接口分配CPU周期。RTM_FFA_DIR_REQ:呈现给执行上下文的运行时模型,该执行上下文通过FFA_…

java-jdbc快速入门

文章目录 简介快速入门 简介 JDBC就是使用Java语言操作关系数据库的一套APIJava DataBase Connectivity 快速入门 -- mysql 中准备工作 create database if not exists my_db; use my_db; create table account(id int,name varchar(20),money int ); insert into account v…

进程和线程

在操作系统中&#xff0c;进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是两个基本的执行单元&#xff0c;它们之间有密切的关系&#xff0c;但又有一些重要的区别。 进程&#xff08;Process&#xff09;&#xff1a; 定义&#xff1a; 进程是一…

深度学习之基于YoloV5血红细胞检测识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习已经在许多领域中得到了广泛的应用&#xff0c;包括医疗健康领域。其中&#xff0c;YOLO&#xff08;You O…

[EFI]Dell XPS 9500电脑 Hackintosh 黑苹果引导文件

硬件型号驱动情况主板Dell XPS 9500 P91F001处理器Intel Core i7-10750H已驱动内存16GB DDR4-2933MHz, 2x8G已驱动硬盘Western Digital PC SN530 NVMe SSD已驱动显卡Intel UHD Graphics 630已驱动声卡Realtek ALC3281 (ALC289 rebranded)已驱动网卡Realtek RTS5260 PCI-E Card …

Python实现WOA智能鲸鱼优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

国学---佛系算吉凶~

佛系算吉凶咯~&#xff0c;正经走访深山庙宇&#xff0c;前辈老人&#xff0c;经过调研后&#xff0c;搭建的轻衍计算模型&#xff0c;团队对国学的初次信息化尝试。 共享给有需要的朋友&#xff0c;准不准没关系&#xff0c;开心最重要。 后续还有财富&#xff0c;事业&…

SVM之SVR参数详解以及调参

SVM之SVR参数详解以及调参 一、参数、属性及方法1、参数kernel = ‘rbf’degree=3gamma=‘scale’coef0=0.0tol=0.001C=1.0epsilon=0.1shrinking=Truecache_size=200verbose=Falsemax_iter=-12、属性class_weight_coef_dual_coef_fit_status_interce

milvus数据库-管理数据库

一个 Milvus 集群最多支持 64 个数据库。 1.创建数据库 先连接数据库服务器&#xff0c;再创建 from pymilvus import connections, dbconn connections.connect(host"127.0.0.1", port19530)database db.create_database("book")2.连接数据库 可以改变…