首页 > 其他分享 >高精度(1)——高精度减法

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

时间:2024-09-30 15:21:47浏览次数:3  
标签:return 高精度 int back -- vector 减法 size

题目描述

给定两个正整数(不含前导 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大于B
	for(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-B
		for(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;
}

标签:return,高精度,int,back,--,vector,减法,size
From: https://blog.csdn.net/r2931887650/article/details/142657543

相关文章

  • vue中使用decimal.js对前端数值类型进行高精度计算
    需求背景:由于一些场景我们需要在前端JavaScript进行数值计算,且对精度要求比较严谨,而前端数值是浮点类型,直接使用计算可能会产生一系列的精度问题,常见的浮点运算问题,比如精度损失等;所以例如涉及到一些金额计算等,需要进行高精度处理。解决方案:(1)可以把数值计算部分逻辑交给后端接口......
  • PTA 实验三 零基础JAVA语言学习 7-1 复数类的定义 要想编写一个复数类,可以进行复数加
      要想编写一个复数类,可以进行复数加法和减法运算。编写一个包含main方法的类测试该复数类。要求该复数类至少包含一个无参的构造方法和一个带参的构造方法;数据成员包括复数的实部和虚部,为double类型;包括两个方法,分别实现复数的加法和减法运算。测试代码如下:publicsta......
  • 高精度人员定位系统在化工企业中的应用-天拓四方
    在化工行业中,安全管理是企业运营不可忽视的重要环节。由于化工企业工作环境复杂多变,存在诸多潜在的安全隐患,如易燃易爆气体、有毒化学物质等,因此,保障员工的安全显得尤为重要。高精度人员定位系统在化工企业的应用实时定位与监控在化工企业中,员工经常需要在复杂的环境中进行作业,如进......
  • 高精度 +-*/
    高精度+-*/高精加模板//C=A+B,A>=0,B>=0vector<int>add(vector<int>&A,vector<int>&B){if(A.size()<B.size())returnadd(B,A);vector<int>C;intt=0;for(inti=0;i<A.size()......
  • 对二进制减法的理解
    以下内容是写在通过NandGame网站学习二进制运算的,但是没想到写了这么多,想着也可以单独发出来写到这里突然想到最近在《编码:隐匿在计算机软硬件背后的语言》这本书看到二进制减法的运算,作者一开始不是直接讲减数要转换成补码再计算,而是讲了十进制减法为了不使用借位如何方便计算......
  • 【多变量输入单步预测】基于减法优化器算法(SABO)优化CNN-BiLSTM-Attention的风电功率
         ......
  • 高精度
    回来第一件事先复习高精高精加:按位相加依次进位倒序输出1#include<bits/stdc++.h>2#definerep(i,a,b)for(inti=a;i<=b;i++)3#definerrep(i,a,b)for(inti=b;i>=a;i--);4usingnamespacestd;5constintM=1e5+1;6stringa,b;7int......
  • KTH7823——16 位高精度低延时霍尔磁编码器可编程 ABZ 和 PWM 输出模式角度传感器
    KTH7823是一款高精度绝对角度霍尔传感器芯片,最高16位分辨率绝对角度输出,可实现在轴向和离轴场合下的无接触式磁场角度测量。不论转速范围在0-120000rpm之间,KTH7823都能快速准确地输出角度信息,适用于需要精准角度测量和转速控制的各个领域。KTH7823......
  • c++高精度求平方根(保留整数)
    #include<iostream>#include<cstring>usingnamespacestd;constintSIZE=200;structhugeint{ intlen,num[SIZE];};hugeinttimes(hugeinta,hugeintb){ inti,j; hugeintans; memset(ans.num,0,sizeof(ans.num)); for(i=1;i<=......
  • <<编码>> 第13章如何实现减法--示例电路
    8位加减法器info::操作说明鼠标单击逻辑输入切换0|1状态鼠标点击SUB开关切换加/减法状态做加法时,和超过255则产生“上溢出”,OU标志变为高电平.做减法时,当B比A大时则产生“下溢出”,OU标志变为高电平.primary::在线交互操作链接https://cc.......