首页 > 其他分享 >P2142 高精度减法

P2142 高精度减法

时间:2024-04-13 13:55:25浏览次数:14  
标签:node P2142 高精度 int len a1 b1 减法 strlen

P2142 高精度减法

题目

高精度减法。

输入

两个整数 \(a,b\)(第二个可能比第一个大)。

输出

结果(是负数要输出负号)。

样例

输入

2
1

输出

1

提示

  • \(20\%\) 数据 \(a,b\) 在 long long 范围内;
  • \(100\%\) 数据 \(0<a,b\le 10^{10086}\)。

思路

根据题意,数据最大范围是 \(10^{10086}\),需要使用高精度算法。高精度数读取与存储的方式借鉴高精度加法,所不同的是在减法运算中需要考虑减数与被减数的大小,以确定差的正负。但高精度减法依然借助数组 a 存储转换后的被减数,数组 b 存储转换后的减数。

如果被减数比减数大,直接根据竖式减法运算规则进行运算。枚举被减数与减数的对应位分别为 \(a_i\) 和 \(b_i\) 进行相减后赋值给 \(c_i\),如果 \(a_i\) 小于 \(b_i\),则向 \(a_{i+1}\) 进行借位操作,之后再进行相减。最后从高位向低位输出 \(c_i\)。

if (a[i] < b[i])
{
    a[i] += 10;
    a[i + 1] --;
}
c[i] = a[i] - b[i];

经过判断如果被减数比减数小,则进行字符串交换,并标记差的符号。字符串比较中,字符串长度大的对应高精度数值较大,如果字符串长度相等,则直接运行字符串函数进行比较。

if (strlen(a1) < strlen(b1) || (strlen(a1) == strlen(b1) && strcmp(a1, b1) < 0))
{
    strcpy(temp, a1);
    strcpy(a1, b1);
    strcpy(b1, temp);
    f = '-'; // 记录差的正负
}

代码一:数组

#include <bits/stdc++.h>

using namespace std;

int a[10100], b[10100], c[10100], lena, lenb, lenc;
char a1[10100], b1[10100], temp[10100], f;

int main()
{
	cin >> a1 >> b1;
	// 判断减数与被减数的大小
	if (strlen(a1) < strlen(b1) || (strlen(a1) == strlen(b1) && strcmp(a1, b1) < 0))
	{
		strcpy(temp, a1);
		strcpy(a1, b1);
		strcpy(b1, temp);
		f = '-'; // 记录差的正负
	}
	lena = strlen(a1);
	lenb = strlen(b1);
	for (int i = 0; i <= lena - 1; i ++ )
		a[lena - i] = a1[i] - 48;
	for (int i = 0; i <= lenb - 1; i ++ )
		b[lenb - i] = b1[i] - 48;
	lenc = lena;
	for (int i = 1; i <= lenc; i ++ )
	{
		if (a[i] < b[i])
		{
			a[i] += 10;
			a[i + 1] --;
		}
		c[i] = a[i] - b[i];
	}
	// 去掉前导 0
	while (c[lenc] == 0 && lenc > 1)
		lenc --;
	if (f == '-')
		cout << '-';
	for (int i = lenc; i >= 1; i -- )
		cout << c[i];
	return 0;
}

代码二:重载运算符

以上代码可以进行空间优化,c 数组可以省略,将差直接存储到 a 数组中。

运用结构体重载运算符的方式也可以得到高精度减法的另一种写法。

#include <bits/stdc++.h>

using namespace std;

char str[10100];

struct node
{
	int len, s[10100];
	node()
	{
		len = 0;
		memset(s, 0, sizeof(s));
	}
};

bool operator >= (const node &a, const node &b) // 判断大小
{
	if (a.len < b.len)
		return 0;
	if (a.len == b.len)
	{
		for (int i = 1; i <= b.len; i ++ )
		{
			if (a.s[i] > b.s[i])
				return 1;
			else if (a.s[i] < b.s[i])
				return 0;
		}
	}
	return 1;
}

node operator - (node &a, const node &b)
{
	node c;
	c.len = max(a.len, b.len);
	for (int i = 1; i <= c.len; i ++ )
	{
		c.s[i] = a.s[i] - b.s[i];
		if (c.s[i] < 0)
		{
			c.s[i] += 10;
			a.s[i + 1] --;
		}
	}
	while (c.len > 0 && !c.s[c.len])
		c.len --;
	if (c.len == 0)
	{
		c.len = 1;
		c.s[1] = 0;
	}
	return c;
}

node read()
{
	scanf("%s", str);
	int len = strlen(str);
	node a;
	a.len = len;
	for (int i = 0; i < len; i ++ )
		a.s[len - i] = str[i] - '0';
	return a;
}

void print(node a)
{
	for (int i = a.len; i >= 1; i -- )
		printf("%d", a.s[i]);
}

int main()
{
	node a, b, c;
	a = read();
	b = read();
	if (a >= b)
		c = a - b;
	else
	{
		c = b - a;
		putchar('-');
	}
	print(c);
	return 0;
}

标签:node,P2142,高精度,int,len,a1,b1,减法,strlen
From: https://www.cnblogs.com/IronMan-PZX/p/18132778

相关文章

  • 好用 爱用 高精度
    做过的都知道适用于哪道题罢高精乘低精。inlinevoidAcheron(llx,inta[],int&lena){ intb[N]; memset(b,0,sizeofb); fo(i,0,lena-1) { b[i]+=a[i]*x; b[i+1]+=b[i]/10; b[i]%=10; } while(b[lena]) { b[lena+1]+=b[lena]/10; b[lena]%=10; lena++......
  • JS 加减乘除 尤其是减法精度问题
    /***除法**/division:function(arg1,arg2){vart1=0,t2=0,r1,r2;try{t1=arg1.toString().split(".")[1]......
  • 【智能算法】减法平均优化器(SABO)原理及实现
    目录1.背景2.算法原理2.1算法思想2.2算法过程3.结果展示4.参考文献1.背景2023年,PTrojovský等人受到数学计算启发,提出了减法平均优化器(Subtraction-Average-BasedOptimizer,SABO)。2.算法原理2.1算法思想SABO利用多个智能体的减法平均值来更新种群成员在搜索......
  • C++实现windows高精度微秒级延时(亲测可用)
    C++实现windows高精度微秒级延时(亲测可用)代码如下:#include<iostream>#include<windows.h>//定义一个结构体来保存性能计数器的频率和时间戳structPerformanceCounter{LARGE_INTEGERfrequency;//计数器频率LARGE_INTEGERstart;//开始时间......
  • GIS入门,EPSG:3857介绍,纯JS如何实现简化得Web墨卡托投影的逆变换和高精度Web墨卡托投影
    EPSG:3857坐标系介绍EPSG:3857坐标系,也称为Web墨卡托投影(WebMercatorprojection),是一种用于Web地图的常见投影系统。它是由谷歌地图在2005年引入并广泛采用的。这个投影系统将地球表面的经纬度坐标转换为平面坐标,使得地图在Web上的显示更加方便和流畅。EPSG:3857坐标系使......
  • 高精度算法(加、减、乘、除,使用c++实现)
    一、概念在我们进行计算的过程中,经常会遇到几十位,甚至几百位的数字的计算问题,也有可能会遇到小数点后几十位,几百位的情况,而我们面对这样的情况下,  和  的数据范围显然是不够使用的了。因此这时,我们就需要引入一个新的算法,叫做高精度算法。高精度算法:它是处理大数字的数......
  • 高精度、低功耗、小封装电压检测芯片 HXWSEMI桦芯微HX61CC2202MR、HX61CC2702MR、HX61
    HX61C系列芯片是使用CMOS技术开发的高精度、低功耗、小封装电压检测芯片。检测电压在小温度漂移的情况下保持极高的精度。客户可选择CMOS输出或OpenDrain输出。■产品特点高精度:±2%低功耗:2.0µA(Vin=1.5V)检测电压范围:1.0V~6.0V,100mV步进工作电压范围:0.7V......
  • 高精度(较难)
    structBigInt{intn,f;//n是位数,f=1是正数,f=-1是负数inta[N];BigInt():n(0),f(1){}BigInt(intx){n=0,f=(x<0?-1:1);x=f*x;while(x!=0)a[n++]=x%10,x/=10;......
  • 高精度算法
    高精度通常,大整数的存储采用数组的形式,其中数组的首位存储大整数的最低位,末位存储最高位举例来说,对于整数123456789,我们可以使用数组存储如下:makefileCopycodeindex:012345678array:[9,8,7,6,5,4,3,2,1]这样,数组的第一......
  • 高精度算法(大数的加、减、乘、除)
    在C/C++中,int占一个机器字长,32位机中则占4个字节,即[-2^31,2^31-1](10的9次方数量级)。不管是32位还是64位机,longlong占8个字节,即[-2^63,2^63-1](10的18次方数量级)。如果超过该数量级,应该使用高精度算法。1加1、将两个加数逆序存储在两个int数组中。(逆序的原因是方便操作和数......