高精度减法

核心代码:

      a[4]a[3]a[2]a[1]

  -  b[4]b[3]b[2]b[1]

-----------------------------------

     c[4]c[3]c[2]c[1]

在这里用数组a与b来保存被减数与减数

1.如果a<b,则交换a与b。(保证被减数始终大于减数,最后在结果加上负号即可)

2.如果a[i]<b[i],那么从高位借1

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


实现代码:

#pragma warning(disable:4996)
#include<iostream>  
#include<cstring>  
using namespace std;
char s1[505], s2[505],s3[505];
int a[505], b[505], c[505];

bool compare(char s1[], char s2[]) {
	int n = strlen(s1);
	int m = strlen(s2);

	//如果输入的数长度不一样,比如123与45,很显然123>45,那么n=3,m=2。
	//返回3>2,为true,又因为if (!compare(s1, s2)),所以不满足条件,即不交换
	if (n != m)         
		return n > m;

	//上面判断了两个数长度不一样的情况,下面是长度一样的情况
	for (int i = 0; i < n; i++) {
		if (s1[i] != s2[i])         
			return s1[i] > s2[i];
	}

	return true;    //这是两个数一样的情况
}

int main() {
	int la, lb, lc;
	//因为我们要让被减数始终大于减数,所以当被减数小于减数时,我们要交换两个数的位置,最后加上负号。
	//比如11 - 65 = -54,我们交换位置后变成65 - 11 = 54,最后在输出前加上负号即可
	//这个flag就是判断是否加负号的标志
	int flag = 0;        

	cin >> s1 >> s2;

	if (!compare(s1, s2)) {  
		flag = 1;                 //如果满足条件,就要交换位置,那么flag的值就要改变
		strcpy(s3, s1);
		strcpy(s1, s2);
		strcpy(s2, s3);
	}

	cout << la << lb <<endl;

	//此处和高精度加法一样,详细解释可以看我的高精度加法
	for (int i = 0; i < la; i++) {
		a[la - i] = s1[i] - '0';         
	}
	for (int i = 0; i < lb; i++) {
		b[lb - i] = s2[i] - '0';
	}

	lc = max(la, lb);

	for (int i = 1; i <= lc; i++) {     //算法核心,注意!!  i从开始
		if (a[i] < b[i]) {
			a[i + 1]--;
			a[i] += 10;
		}
		c[i] = a[i] - b[i];

	}

	//如果两个数相减,例如123 - 111 = 12,lc=3;
	//那么在数组c中保存的就是c[0];c[1]=2;c[2]=1;c[3]=0;
	//c[lc] == 0  就是c[3]=0 满足条件

	//条件 lc > 1 就是保证0 - 0 = 0的情况
	while (c[lc] == 0 && lc > 1)   
		lc--;

	if (flag == 1)           //如果两个数交换了位置,则先输出负号
		printf("-");

	for (int i = lc; i > 0; i--) {
		printf("%d", c[i]);
	}

	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值