c++高精度减法

server/2025/3/27 11:21:58/

我们在计算高精度减法的时候其实和高精度加法是有着异曲同工之处的,唯一需要改变的就是借位的逻辑还有数字大小的逻辑

下来我们来写一写高精度减法

刚开始呢我们还是和高精度加法一样高精度加法,我们需要先反转再计算

代码如下:

int main()
{string a,b;cin>>a>>b;//反转 reverse(a.begin(),a.end());reverse(b.begin(),b.end());vector<int>A,B;//添加至数组 for(int i=0;i<a.size();i++)A.push_back(a[i]-'0');for(int i=0;i<b.size();i++)B.push_back(b[i]-'0');return 0;} 

在我们反转完成后我们就需要判断哪一个数字大了
具体原因已写在注释中
代码:

int main()
{string a,b;cin>>a>>b;//反转 reverse(a.begin(),a.end());reverse(b.begin(),b.end());vector<int>A,B;//添加至数组 for(int i=0;i<a.size();i++)A.push_back(a[i]-'0');for(int i=0;i<b.size();i++)B.push_back(b[i]-'0');//计算前准备工作,判断A和B谁大,我们这里假设A>=Bvector<int>C;//结果 if(cmp(A,B)){//如果我们的A大于B相减一定是正数,我们直接计算C=sub(A,B);} else{//如果是B大于A的话,那么我们相减的值一定是负值,所以我们在输出结果之前需要先输出一个' - ',同时交换相减的顺序,例如5-7=-2 我们在计算的时候也是先反过来 7-5=2 最后加上' - '完成计算cout<<'-';C=sub(B,A);  }reverse(C.begin(),C.end());for(auto &e:C)cout<<e; return 0;} 

cmp函数:

bool cmp(vector<int>&A,vector<int>&B)
{if(A.size()!=B.size())return A.size()>B.size();//如果长度不一样的话我们返回 (A的长度是不是大于B的长度,如果A的长度大于B的长度那么我们返回的是true,反之我们返回false) for(int i=A.size()-1;i>=0;i--)//如果长度一样的话,我们就要寻找两个数第一个位置不相等的数的大小,看A大还是B大 例如 978 和987 当从最高位向下寻找的时候 发现9相同,下来比较 7和8 8大于7 所以B大于A{if(A[i]!=B[i]) return A[i]>B[i];}return true;//如果两个数相等的话,那么就返回true因为我们假设的是A>=B 
}

主要计算函数

vector<int>sub(vector<int>A,vector<int>B)
{vector<int>C;//进行减法计算int t=0;//t代表借位for(int i=0;i<A.size();i++){t=A[i]-t;//开始计算,首先个位是不可能借出去位的所以t第一次一定等于0 if(i<B.size())t-=B[i];//判断B是否还有位数 C.push_back((t+10)%10);//这里算出来的是 此时A位-B位-借出去的数 ,这里+10后取模是为了结合两种情况,第一种情况A-B小于0,比如5-7=-2加10之后变为12 再用10取模得到2 同时下一步记录需要借位 第二种情况A-B大于0例如7-5=2 2+10=12取模等于 2 同时t>0 记录下一步不需要借位 if(t<0)t=1;else t=0;	} //最后需要去处掉补位的0while(C.size()>1&&C.back()==0) C.pop_back();//判断C的长度大于1同时后面等于0 例如11000000000 我们返回后反转得到的结果就是 00000000011所以我们要去处这些补位的 0return C;
}

最终代码:

#include<bits/stdc++.h>
using namespace std;
bool cmp(vector<int>&A,vector<int>&B)
{if(A.size()!=B.size())return A.size()>B.size();//如果长度不一样的话我们返回 (A的长度是不是大于B的长度,如果A的长度大于B的长度那么我们返回的是true,反之我们返回false) for(int i=A.size()-1;i>=0;i--)//如果长度一样的话,我们就要寻找两个数第一个位置不相等的数的大小,看A大还是B大 例如 978 和987 当从最高位向下寻找的时候 发现9相同,下来比较 7和8 8大于7 所以B大于A{if(A[i]!=B[i]) return A[i]>B[i];}return true;//如果两个数相等的话,那么就返回true因为我们假设的是A>=B 
}
vector<int>sub(vector<int>A,vector<int>B)
{vector<int>C;//进行减法计算int t=0;//t代表借位for(int i=0;i<A.size();i++){t=A[i]-t;//开始计算,首先个位是不可能借出去位的所以t第一次一定等于0 if(i<B.size())t-=B[i];//判断B是否还有位数 C.push_back((t+10)%10);//这里算出来的是 此时A位-B位-借出去的数 ,这里+10后取模是为了结合两种情况,第一种情况A-B小于0,比如5-7=-2加10之后变为12 再用10取模得到2 同时下一步记录需要借位 第二种情况A-B大于0例如7-5=2 2+10=12取模等于 2 同时t>0 记录下一步不需要借位 if(t<0)t=1;else t=0;	} //最后需要去处掉补位的0while(C.size()>1&&C.back()==0) C.pop_back();//判断C的长度大于1同时后面等于0 例如11000000000 我们返回后反转得到的结果就是 00000000011所以我们要去处这些补位的 0return C;
}
int main()
{string a,b;cin>>a>>b;//反转 reverse(a.begin(),a.end());reverse(b.begin(),b.end());vector<int>A,B;//添加至数组 for(int i=0;i<a.size();i++)A.push_back(a[i]-'0');for(int i=0;i<b.size();i++)B.push_back(b[i]-'0');//计算前准备工作,判断A和B谁大,我们这里假设A>=Bvector<int>C;//结果 if(cmp(A,B)){//如果我们的A大于B相减一定是正数,我们直接计算C=sub(A,B);} else{//如果是B大于A的话,那么我们相减的值一定是负值,所以我们在输出结果之前需要先输出一个' - ',同时交换相减的顺序,例如5-7=-2 我们在计算的时候也是先反过来 7-5=2 最后加上' - '完成计算cout<<'-';C=sub(B,A);  }reverse(C.begin(),C.end());for(auto &e:C)cout<<e; return 0;} 

结果:
在这里插入图片描述


http://www.ppmy.cn/server/178705.html

相关文章

selenium(鼠标操作、页面操作、用例设计)

ActionChains类&#xff08;鼠标操作&#xff09; 常用于模拟鼠标的行为&#xff0c;比如单击、双击、拖拽等行为 click(on_elementNone) --- 鼠标单击 double_click(on_elementNone) --- 双击 context_click(on_elementNone) --- 右击…

系统设计类问题回答模板

在系统设计类问题的面试中,一个好的回答不仅仅体现了候选人的技术能力,还能展现其对问题本质的理解、清晰的沟通技巧以及解决方案的条理性和可扩展性。以下是一个通用的回答模板,以及回答技巧、白板演示的指导方法,并会结合实际案例提供一些示例。 一、系统设计类问题回答的…

2025-03-23 学习记录--C/C++-C语言 sprintf()实现将多个值按指定格式拼接成字符串

C语言 sprintf()实现将多个值按指定格式拼接成字符串 举个例子 &#x1f330;&#xff1a;将字符串 “m” 与数字 0、1、2 动态拼接成 “m0”、“m1”、“m2”&#xff1a;&#x1f447;&#x1f3fb; #include <stdio.h> // 包含标准输入输出库&#xff0c;用于使用输入…

《Manus学习手册》.pdf(文末附完整版下载地址)

大家好&#xff0c;我是吾鳴。 吾鳴今天要给大家分享的一份比较全面详细的Manus学习手册&#xff0c;该学习手册主要包含Manus产品概述与核心理念、Manus功能与使用场景、Manus技术架构与工作流、Manus案例库与用户实践、邀请码获取与内测信息、Manus与传统AI对比与优势、用户评…

分治-快速排序系列一>快速排序

目录 题目方法&#xff1a;优化方法&#xff1a;代码&#xff1a; 题目方法&#xff1a; 忘记快速排序看这里&#xff1a;链接: link 优化方法&#xff1a; 代码&#xff1a; public int[] sortArray(int[] nums) {qsort(nums,0,nums.length-1);return nums;}private void qso…

Python模块化设计——递归

1.以下代码执行后,输出结果为____________。 def printDigit(n):print(n%10,end="")if(n>10

如何在百度搜索上删除与自己名字相关的资料

个人信息的网络足迹如同一张无形的网&#xff0c;将我们与世界的每一个角落紧密相连。然而&#xff0c;当某些与自己名字相关的资料不再希望被公众轻易检索到时&#xff0c;如何在百度搜索中有效“隐身”&#xff0c;成为了一个亟待解决的问题。面对复杂多变的网络环境&#xf…

AF3 Rotation 类解读

Rotation 类(rigid_utils 模块)是 AlphaFold3 中用于 3D旋转 的核心组件,支持两种旋转表示: 1️⃣ 旋转矩阵 (3x3) 2️⃣ 四元数 (quaternion, 4元向量) 👉 设计目标: 允许灵活选择 旋转矩阵 或 四元数 封装了常用的 旋转操作(组合、逆旋转、应用到点上等) 像 torch.…