高精度(1)——高精度减法

news/2024/10/4 4:02:12/

题目描述

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

1≤整数长度≤100000

输入样例

32
11

输出样例

21

注释版代码

#include<iostream>
#include<vector>
using namespace std;
//判断A>=B是否
bool cmp(vector<int> &A,vector<int> &B)
{if(A.size()!=B.size())//如果A和B的长度不一致return A.size()>B.size();//那么我们直接返回A的长度>B的长度即A大于Bfor(int i=A.size()-1;i>=0;i--)//如果一致,那么我们从高位往后比较,只要相同位大小比较成功即可判断{if(A[i]!=B[i])//如果A某位数字和B的该位数字不一致{return A[i]>B[i];//返回A[i]>B[i],即A>B}}return true;//如果都不满足以上条件说明两个数是相等的,也返回true
}
vector<int> sub(vector<int> &A,vector<int> &B)
//加&是因为:避免复制:传递大型vector时,复制整个vector是非常耗时和占用内存的,通过引用传递则避免了这一问题。
//提高效率:引用传递速度更快,因为它仅仅是传递了一个指向原始数据的指针,而不是复制整个数据结构。
{vector<int> C;int t=0;//t表示借位,如果相减是后面那位有借位,前面相减的时候我们就得把借位给它减下去for(int i=0;i<A.size();i++)//因为我们已经确保A一定大于B,所以用A的长度更保险{int m=A[i]-t;//设m为减完之后的数字,所以相减时都要减去被借的if(i<B.size()) m=m-B[i];//如果B还有长度,就把B减下去,如果没有B了,那就不用减了C.push_back((m+10)%10);//最后把(m+10)%10放进C容器里准备输出,(m+10)%10是一个通用式,分解后如下://m>=0,说明相减不用借位,C.push_back(m)//m<0,说明不够减的,需要借位,C.push_back(m+10)if(m<0) t=1;//不够减的,就借1位else t=0;//不然就不用借}while(C.size()>1&&C.back()==0)//如果长度>1,比如003,并且最后放进去的是0(保证长度其实是为了保证结果为0的存在){C.pop_back();//我们就把这两个0都去掉,直到长度不大于1,并且前面没有0了}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');//装进vector<int>容器里面,方便进行比较位数,并且vector容器的长度可以控制}for(int i=b.size()-1;i>=0;i--){B.push_back(b[i]-'0');}if(cmp(A,B))//cmp函数是验证是否A>=B,返回true和false{auto C=sub(A,B);//如果A>=B,则用A-Bfor(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);}else{auto C=sub(B,A);//如果A(not)>=B,则用B-A,既然都是用大的减去小的,所以sub函数只需要考虑大的减去小的即可printf("-");for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);}return 0;
}

http://www.ppmy.cn/news/1533419.html

相关文章

【2024】前端学习笔记11-网页布局-弹性布局flex

学习笔记 网页布局弹性布局&#xff1a;flex案例&#xff1a;flex布局案例 网页布局 在页面布局中&#xff0c;display属性用于设置一个元素的显示方式。它可以指定元素是作为块级元素、内联元素还是充当表格元素显示。 display的常见属性值&#xff1a; block&#xff1a;将…

解决$‘r‘ command not found或者文件夹显示’tvsf 33‘$‘r‘

问题现象: 某客户反馈在执行脚本的时候文件夹显示存在问题,如下图: 但是脚本文件中的内容并没有\r字符,如下图: 也有客户反馈如下: 问题分析: $\r’是回车符的转义表示。在Unix和Linux系统中,回车符是一个不可见的控制字符,它通常用于文本文件中的行结尾。以上…

Docker的实践应用举例

Docker作为一种流行的容器化技术&#xff0c;已经广泛应用于软件开发、部署、运维等多个领域。它通过将应用程序及其依赖项打包到可移植的容器中&#xff0c;极大地简化了应用的部署和管理过程。以下将详细探讨Docker的实践与应用&#xff0c;并通过多个具体例子来展示其强大的…

【d57】【sql】1661. 每台机器的进程平均运行时间

思路 一方面考察自连接&#xff0c;另一方面考察group by 这里主要说明 group by 用法&#xff1a; 1.在 SQL 查询中&#xff0c;GROUP BY 子句用于将结果集中的行分组&#xff0c;目的通常就是 对每个组应用聚合函数&#xff08;如 SUM(), AVG(), MAX(), MIN(), COUNT() 等…

python-ds:Python 中的数据结构库(适用于面试的数据结构和算法合集)

在软件开发中&#xff0c;数据结构是组织和存储数据的方式&#xff0c;对算法的效率和程序的性能至关重要。Python 提供了许多内置的数据结构&#xff0c;但在一些复杂的应用场景中&#xff0c;原生数据结构可能无法满足特定需求。这时&#xff0c;一个功能强大、易于使用的数据…

Rainbond 助力城建智控,从传统开发到敏捷开发转型

在现代企业的数字化转型过程中&#xff0c;如何高效管理和快速部署业务应用已经成为各行业的核心挑战。尤其是在智慧工地和办公自动化&#xff08;OA&#xff09;这样的关键业务场景中&#xff0c;企业不仅需要面对频繁的系统更新&#xff0c;还要确保系统的稳定性与高效运作。…

如何在 Vue 3 项目中使用 Vuex 进行状态管理?

在 Vue 3 中使用 Vuex 进行状态管理是一个很好的实践&#xff0c;特别是在涉及到多个组件间共享状态的情况。下面是如何在 Vue 3 项目中设置和使用 Vuex 的教程&#xff0c;包括 state, mutations, actions, getters 的概念及其用途。 1. 安装 Vuex 首先确保你的项目已经安装…

C++ 游戏开发

C游戏开发 C 是一种高效、灵活且功能强大的编程语言&#xff0c;因其性能和控制能力而在游戏开发中被广泛应用。许多著名的游戏引擎&#xff0c;如 Unreal Engine、CryEngine 和 Godot 等&#xff0c;都依赖于 C 进行核心开发。本文将详细介绍 C 在游戏开发中的应用&#xff0…