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

加法:

大整数该如何储存?

用数组储存:

把个位放在数下标为0的位置,十位放在数组下标为1的位置(也就是高位放在数组的后面)

因为这样,如果需要增加一位最高位,那我们就可以直接在vector数组的最后push_back最高位到结果数组即可。如果数组低位存的是数的高位,那么我们进行这个操作的时候就需要往后一个一个移动数组,效率很慢。

例题:

#include<bits/stdc++.h>
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(t);//如果需要再进位,就需要增加最高位return C;
}
int main()
{string a,b;cin>>a>>b;vector<int> 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');auto C = add(A,B);for(int i=C.size() - 1;i>=0;i--) cout<<C[i];return 0;
}

减法:

总体思路:

减法和加法一样,是在数组下标小的位置储存位数小的数字

首先我们需要先判断数字A和数字B的大小,可以从高开始判断。如果大于等于直接计算A-B,否则就计算B-A,添加一个负号。

在执行减法的算法中,我们不难发现如果高位已经为0的时候就会出现前导0,例如100-97=3,在数组中储存的是003,所以我们需要去除前导0,恰好前导0刚好在数组的末尾也就是C.back()。我们只需要循环执行,如果末尾是0就pop()

例题 

#include<bits/stdc++.h>
using namespace std;
string a,b;
vector<int> A,B;
bool cmp()//判断A是否>=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;int t = 0;for(int i=0;i < A.size();i++){//减去借位 t = A[i] - t;//一定要判断对应要减去的数字是否存在,在进行减法 if(i < B.size()){t-=B[i];}//把每一位的结果转化为正数后加入结果数组中 C.push_back((t + 10) % 10);//如果t<0说明需要借位,t设为1 if(t < 0) t = 1;else t = 0;}//移除前导0,最高位都在数组的最后 while(C.size()>1&&C.back()==0) 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');for(int i=b.size()-1;i>=0;i--) B.push_back(b[i] - '0');//比较A和B的大小,如果A>B就直接计算A-B的大小,否则就计算B-A,加上一个负号 if(cmp()){auto C = sub(A,B);for(int i=C.size() - 1;i>=0;i--) cout<<C[i];}else{auto C = sub(B,A);cout<<"-";for(int i=C.size() - 1;i>=0;i--) cout<<C[i];}return 0;
}

除法:

整体思路:

  • 逐位模拟除法

手工长除法的核心步骤是逐位计算商和余数。为了实现这种逐位的计算过程,我们从被除数的最高位开始处理。每次将当前处理的数字(即当前位)与前一次计算的余数组合,构成一个新的“被除数”。

  • 商和余数的计算

每次构成新的“被除数”后,将它除以除数,得到商的当前位,余数则留给下一位继续处理。每一位的商计算完成后,商值存储下来,余数用于下一轮的计算。

  • 反转商的顺序

由于我们是从被除数的高位向低位处理,计算过程中得到的商是倒序的(即最低位商最先被计算出)。在最终输出时,需要将计算得到的商反转,才能得到正确的顺序。

  • 去除前导零

计算过程中可能会出现前导零(例如当某些高位不足以大于除数时,商位可能为零)。为了保证输出格式正确,需要在最终输出商时移除这些前导零。

例题:

#include<bits/stdc++.h>
using namespace std;
string a;
int b,r; //r是余数 
vector<int> A;vector<int> div() {vector<int> C;//商 for(int i=A.size() - 1;i>=0;i--){r = r*10 +A[i];C.push_back(r / b);r = r % b;}//由于计算过程从低位到高位逐步推进最初得到的结果向量 C 是倒序的(即最高位在最前面)。//为了得到一个正常顺序的结果(即最高位在最后面),需要将 C 中的元素顺序反转reverse(C.begin(),C.end());// 移除结果中的前导零while (C.size() > 1 && C.back() == 0) {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 = div();for(int i = C.size() - 1; i >= 0; i--) cout << C[i];cout<<endl<<r<<'\n';//输出余数 return 0;
}

 乘法:

详细思路:

  1. 逐位相乘

将被乘数的每一位与乘数逐一相乘,并且从低位开始处理。这相当于我们手工计算乘法时,按位进行乘法运算。

  1. 进位处理

每次计算一位的结果时,可能会产生一个进位。例如,计算某一位时结果可能是 13,则当前位为 3,进位 1。这个进位要加到下一位的计算中。

  1. 移除前导零

乘法运算可能产生一些前导零,尤其是在乘数是 0 或者被乘数中某些高位为 0 的情况下。我们需要在输出之前移除这些前导零。

例题:

#include<bits/stdc++.h>
using namespace std;
string a;
int b; 
vector<int> A;
​
vector<int> Mul() {vector<int> C;int t = 0;//进位 // 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.size() > 1 && C.back() == 0) {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 = Mul();for(int i = C.size() - 1; i >= 0; i--) cout << C[i];return 0;
}
​

解释乘法算法的for循环停止条件

i小于A.size()时,循环继续,处理A中的每一位数字。

i等于或大于A.size()时,只要t不为0(即还有未处理完的进位),循环也会继续。这确保了所有的进位都被正确处理,直到没有新的进位产生。

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

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

相关文章

前端基础 | HTML基础:HTML结构,HTML常见标签

文章目录 HTML1、HTML结构1.1HTML标签1.1.1标签1.1.2标签含义 1.2HTML文件基本结构1.3标签层次结构1.4 快速生成代码框架 2、HTML常见标签2.1注释标签2.2标题标签&#xff1a;h1–h62.3段落标签&#xff1a;p2.4 换行标签&#xff1a;br2.5格式化标签2.6 图片标签&#xff1a;i…

git submodule子模块的使用

子模块的使用 添加子模块 添加子模块 git submodule add <子仓库URL> <子仓库路径> 例子&#xff1a; git submodule add http://192.168.100.181/guideir/poco.git 3rdparty/poco 若子模块存在好几个分支&#xff0c;可以在添加子模块时&#xff0c;指定分支 g…

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位&#xff1a;为1时表示在内存期间被访问过&#xff0c;为0时表示未被访问&#xff1b;修改位&#xff1a;为1时表示该页面自从被装入内存后被修改过&#xff0c;为0时表示未修改过。 置换页面时&#xff0c;最先置换访问位和修改位为…

mac安装spark

参考&#xff1a;在Mac上安装Spark apache-spark-3.5.1_mac安装spark-CSDN博客 几个需要用到的路径&#xff1a; hadoop的bin目录&#xff1a;/opt/homebrew/Cellar/hadoop/3.4.0/bin spark的conf目录/opt/homebrew/Cellar/apache-spark/3.5.2/libexec/conf spark的bin目录&am…

iOS——retain和release底层原理

retain实现原理 retain的源码&#xff1a; //使用此方法等价于使用[this retain] inline id objc_object::retain() {//确保对象不是tagged pointerASSERT(!isTaggedPointer());return rootRetain(false, RRVariant::FastOrMsgSend); }ALWAYS_INLINE id objc_object::rootR…

VR虚拟展厅的应用场景有哪些?

虚拟展厅作为一种利用虚拟现实技术构建的三维展示空间&#xff0c;其应用场景广泛且多样。视创云展为企业虚拟展厅搭建提供技术支持。以下是一些主要的应用场景&#xff1a; 1. 博物馆和艺术展览 文物保护与展示&#xff1a; 在博物馆中&#xff0c;为了保护珍贵的文物和艺术…

数据结构与算法学习day20-二叉树的最大深度、最小深度、完全二叉树的节点个数、平衡二叉树、二叉树所有路径

一、二叉树的最大深度 1.题目 104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 2.思路 2.1递归法 二叉树节点的深度&#xff1a;指从根节点到该节点的最长简单路径边的条数或者节点数&#xff08;取决于深度从0开始还是从1开始&#xff09;二叉树节点的高度…

【Python 学习】Pandas基础与应用(1)

题目 1 Pandas 简介1.1 主要特征1.2 Pandas 安装 2 Pandas中的数据结构2.1 Series 数据结构和操作2.1.1 Series的数据结构2.1.2 Seres的操作 2.2 DataFrame 数据结构和操作2.2.1 DataFrame 数据结构2.2.2 Dataframe 操作2.2.3 DateFrame 的特殊操作 2.3 Series 和 DataFrame 的…

Linux——网络基础Socket编程

目录 一计算机网络背景 二协议 1初始协议 1.1协议分层 1.2OSI七层模型 1.3TCP/IP五层模型 2再始协议 2.1为什么要有TCP/IP协议 2.2TCP/IP与OS的关系 2.3所以什么是协议 三网络传输基本流程 1局域网&#xff08;以太网&#xff09;通信原理 1.1认识mac地址 2同…

【牛站 / USACO2007】

题目 思路 离散化&#xff08;降低空间复杂度&#xff09; 点的编号 ∈ [ 1 , 1000 ] &#xff0c;但是点的个数最多为 2 ⋅ T ∈ [ 4 , 200 ] 点的编号 \in [1, 1000]&#xff0c;但是点的个数最多为 2 \cdot T \in[4, 200] 点的编号∈[1,1000]&#xff0c;但是点的个数最多为…

python文件自动化(4)

接上节课内容&#xff0c;在开始正式移动文件到目标文件夹之前&#xff0c;我们需要再思考一个问题。在代码运行之前&#xff0c;阿文的下载文件夹里已经存在一些分类文件夹了&#xff0c;比如图例中“PDF文件”这个文件夹就是已经存在的。这样的话&#xff0c;在程序运行时&am…

电脑硬盘数据丢失了怎么恢复?简单实用的硬盘数据找回的方法

我们的电脑使用硬盘作为存储设备来保存数据&#xff0c;硬盘里的数据是存储在扇区上&#xff0c;这些存储数据的单元则位于表面有磁性材料的旋转的盘片上。硬盘内部的磁头悬浮于高速旋转的盘片上&#xff0c;用于读写和检索数据。 假如我们使用电脑时不小心删除了某个文件&…

【B题第二套完整论文已出】2024数模国赛B题第二套完整论文+可运行代码参考(无偿分享)

2024数模国赛B题完整论文 摘要&#xff1a; 随着电子产品制造业的快速发展&#xff0c;质量控制与成本优化问题成为生产过程中亟待解决的核心挑战。为应对生产环节中的质量不确定性及成本控制需求&#xff0c;本文结合抽样检测理论和成本效益分析&#xff0c;通过构建数学模型…

ELK笔记

要搞成这样就需要钱来买服务器 开发人员一般不会给服务器权限&#xff0c;不能到服务器上直接看日志&#xff0c;所以通过ELK看日志。不让开发登录服务器。即使你查出来是开发的问题&#xff0c;费时间&#xff0c;而且影响了业务了&#xff0c;就是运维的问题 开发也不能登录…

2024国赛数学建模C题论文:基于优化模型的农作物的种植策略

大家可以查看一下35页&#xff0c;包含结构完整&#xff0c;数据完整的C题论文&#xff0c;完整论文见文末名片 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xf…

Computer Exercise

每日一练 单选题 &#xff08;     D     &#xff09; 的作用是在外界中断供电的情况下&#xff0c;及时给计算机等设备供电。 A.WPS     B.USB     C.UBS     D.UPS&#xff08;    B     &#xff09;广泛应用于精密仪器、医疗设备等对电流稳定性要求较高的场…

Unity之获取Avpro视频画面并在本地创建缩略图

一、效果 获取StreamingAssets文件夹下的所有视频&#xff08;包含其子文件夹&#xff09;&#xff0c;获取指定时间的视频画面&#xff0c;然后将图片保存到本地磁盘中。 二、关于Avpro的事件监听 当指定视频时间进度时会触发FinishedSeeking&#xff0c;代表加载完成这时我们…

fpga系列 HDL:Relu激活函数实现与仿真

代码实现对OUTPUT_NODES个32位浮点数进行RELU操作。32位浮点数的二进制表示遵循 IEEE 754 标准&#xff0c;通常称为单精度浮点数。这个标准定义了浮点数的表示方法&#xff0c;具体分为三个部分&#xff1a; 符号位 (1 bit): 用于表示浮点数的正负。&#xff08; 0 表示正数&a…

全国糖酒会,就这5个字。“会天下美味”

“全国糖酒会&#xff0c;会天下美味”&#xff0c;是全国糖酒会的品牌口号。这个品牌口号来的非常偶然。 两年前&#xff0c;全国糖酒会准备更新标志之时&#xff0c;也设计了一个品牌口号。新标志发布前几天&#xff0c;临时作了调整&#xff0c;最终变成了“全国糖酒会&…

linux下oracle启动及关于pfile和spfile启动参数文件的配置

在现代企业环境中&#xff0c;Oracle数据库作为关键的业务支撑平台&#xff0c;承载着大量的数据处理和事务管理任务。 无论是对于DBA&#xff08;数据库管理员&#xff09;还是开发人员来说&#xff0c;掌握Oracle数据库的基本操作和配置技巧都是至关重要的。本文提供了一份全…