当前位置: 首页 > article >正文

高精度算法:高精度减法

P2142 高精度减法 - 洛谷 | 计算机科学教育新生态

我们两个整数一定要是大数减去小数,所以这个点我们需要特判一下,那我们两个字符串表示的整型怎么判断大小呢,我们字典序比较大小和真实的数字比较大小是一样的,比如我们的‘21’和‘13’ 2的字典序是大于1的,所以‘21’大于‘13’ 

但是是有特殊情况的,比如按字典序‘101’是小于‘91’的,所以我们比较的时候应当先比较字符串长度,长度长的一定是大数

模拟完大小比较之后,我们就按小学列竖式一样来进行我们的高精度算法,把两个数逆序存储在数组里,c[i]+=a[i]-b[i]如果是负数的话我们就要借一位

下面我们来实现一下代码

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N];
int la, lb, lc;
bool cmp(string& x, string& y)
{
	if (x.size() != y.size()) return x.size() < y.size();
	else
		return x < y;
}
void sub(int a[], int b[], int c[])
{
	for (int i = 0; i < lc; i++)
	{
		c[i] += a[i] - b[i];
		if (c[i] < 0)
		{
			c[i + 1] -= 1;
			c[i] += 10;
		}
	}
	//处理前导0
	while (lc > 1 && c[lc - 1] == 0) lc--;
}
int main()
{
	string x, y; cin >> x >> y;

	if (cmp(x, y)) {
		swap(x, y); cout << "-";
	}
	la = x.size(); lb = y.size(); lc = max(la, lb);

	for (int i = 0; i < la; i++)
	{
		a[la - 1 - i] = x[i] - '0';
	}
	for (int i = 0; i < lb; i++)
	{
		b[lb - 1 - i] = y[i] - '0';
	}
	sub(a, b, c);
	for (int i = lc - 1; i >= 0; i--)
	{
		cout << c[i];
	}



	return 0;
}


http://www.kler.cn/a/525420.html

相关文章:

  • Windows11无法打开Windows安全中心主界面
  • 正则表达式入门
  • 为AI聊天工具添加一个知识系统 之78 详细设计之19 正则表达式 之6
  • OpenHarmony 5.0.2 Release来了!
  • IO进程寒假作业DAY6
  • Node.js与MySQL模块结合:打造安全高效的用户信息管理系统
  • 【C++动态规划 状态压缩】2597. 美丽子集的数目|2033
  • 单细胞-第五节 多样本数据分析,打分R包AUCell
  • 简单聊聊“DeepSeek”
  • 【设计测试用例自动化测试性能测试 实战篇】
  • 2.3.1 基本数据类型
  • 获取snmp oid的小方法1(随手记)
  • 谈谈道教生物学
  • 蛇年新春 利士策与您 共贺吉祥
  • 【go语言】结构体
  • 有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
  • buu-pwn1_sctf_2016-好久不见29
  • 阅读:在方寸之间重构人类文明的精神版图
  • 解决问题:2874. 有序三元组中的最大值 II
  • 无心剑七绝《恭贺新春》
  • ADC 精度 第一部分:精度与分辨率是否不同?
  • AD电路仿真
  • C++ unordered_map和unordered_set的使用,哈希表的实现
  • 28【UTF-8和GBK】
  • E. Binary Search
  • 是否需要显式使用 epoll_ctl ( fd , EPOLL_CTL_DEL , ... ) 来从红黑树里显式删除过期的套接字