基础算法-大整数减法

 算法原理:

  • 这个算法求的是高精度整数之间的减法
  • 通过vector容器逆序存储被减数和减数,逐位相减,用变量 t 存储每一位的差,得到结果用vector容器存储并输出。

代码实现:

#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
using namespace std;

bool Cmp(vector<int> &A, vector<int> &B);	//声明比较函数
vector<int> Except(vector<int> &A, vector<int> &B);	//声明求差函数
vector<int> Sub(vector<int> &A, vector<int> &B);	//声明减法函数

int main()
{
	string a, b; cin >> a >> b;	//输入被减数a和减数b
	vector<int> A, B;	//创建vector容器存储被减数和减数

	//将被减数和减数存入vector容器
	for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
	for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');

	vector<int> C = Sub(A, B);	//减法运算,将结果存入vector容器C中

	//输出求得的C
	for (int i = C.size() - 1; i >= 0; i--)
	{
		printf("%d", C[i]);
	}

	return 0;
}

//定义比较函数,比较A和B的大小,若A大于B则返回true,否则返回false
bool Cmp(vector<int> &A, vector<int> &B)
{
	if (A.size() != B.size()) return A.size() > B.size();	//位数比较

	for (int i = A.size() - 1; i >= 0; i--) if (A[i] != B[i]) return A[i] > B[i];	//位数相同,逐位比较
	
	return true;
}

//定义求差函数
vector<int> Except(vector<int> &A, vector<int> &B)
{
	vector<int> C;	//定义差为C

	int t = 0;	//定义t表示逐位的差

	for (int i = 0; i < A.size(); i++)	//从低位向高位遍历
	{
		t += A[i];	//t先加上被减数A的每一位
		if (i < B.size()) t -= B[i];	//再减去减数B相应的那一位
		if (t < 0) { C.push_back(t + 10); t = -1; }	//若结果t小于0,则需要借位,存入t+10,再将t置为-1,表示向高位借了位
		else { C.push_back(t); t = 0; }	//若结果t大于等于0,则无需借位,直接存入t,将t置为0即可
	}

	while (C[C.size() - 1] == 0 && C.size() > 1) C.pop_back();	//清除高位的无效0

	return C;
}

//定义减法函数
vector<int> Sub(vector<int> &A, vector<int> &B)
{
	if (Cmp(A, B)) return Except(A, B);	//若A大于B,则直接用A减去B得到差
	else { printf("-");  return Except(B, A); }	//若A小于B,则先输出负号,再用B减去A得到答案
}

欢迎大家探讨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值