2020-12-12

大整数相减;相比于大整数相加,大整数相减多了一个比大小和最后输出时再次将int型数组转化成字符串的形式进行输出;

#include <bits/stdc++.h>
using namespace std;
 const int maxn = 210;//固定数组的大小; 
 string yunsuan(char *s1, char *s2){
	int a[maxn], b[maxn];
	memset(a, 0, sizeof(a));//a,b数组的初始化; 
	memset(b, 0, sizeof(b));//
	int len1 = strlen(s1), len2 = strlen(s2);
	int maxLen = max(len1, len2);
	for (int i = 0; i < len1; i++) a[i] = s1[len1 - i - 1] - '0';//将a,b数组的值倒序输入至整型数组内; 
	for (int i = 0; i < len2; i++) b[i] = s2[len2 - i - 1] - '0';
	for (int i = 0; i < maxLen; i++) {
		if (a[i] - b[i] < 0) {
			a[i] = a[i] + 10 - b[i];
			a[i + 1] -= 1;
		}
		else a[i] -= b[i];
	}
	string str = "";
	int i;
	for (i = maxLen - 1; i >= 0; i--)if (a[i] != 0)break;//除去前导零 
	for (; i >= 0; i--)str += a[i] + '0';//再次将字符int型整型数组转化成字符串的形式; 
	return str;
}
 string bidaxiao(char *s1, char *s2) {//这一部分用于比较两数值的大小,看是谁减谁; 
	if (strcmp(s1,s2)==0)return "0"; //两个数相等,直接返回零; 
	int len1 = strlen(s1), len2 = strlen(s2);
	if (len1 > len2)
		return yunsuan(s1, s2);
	else if (len1 < len2)
		return "-" + yunsuan(s2, s1); //负数
	else {                        //长度相等时判断大小
		for (int i = 0; i < len1; i++) {
			if (s1[i] - '0' > s2[i] - '0')
				return yunsuan(s1, s2);
			else if (s1[i] - '0' < s2[i] - '0')
				return "-" + yunsuan(s2, s1);
		}
	}
}
 int main() {
	char s1[maxn],s2[maxn];
	scanf("%s\n%s",s1,s2);
	cout << bidaxiao(s1,s2) <<endl;
	return 0;
}

总之,
1.根据题意确定maxn的值;const int maxn;
2.定义两个int型数组来储存两个大整数,并用memset(变量名称,初始化的值,sizeof(变量名称))进行初始化;
3.用a[i]进行运算后数值的储存,都是到最大位;
4.重点部分::::定义一个string,从最高位开始a[maxn-1]往下找,直到找出不为零的一位结束,继续从不为零的那一位开始str+=a[i]+‘0’;此时的str即是结果;
5.判断部分主要是长度相等时,从s1[0]即最高位开始比较s1[i]-‘0’;
现在已是凌晨一点,室友都睡了,感觉有用的话,给点个赞吧;
温馨提示:《《《仅适用于大正整数的相减》》》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值