大数系列——大数减法

会了加法,自然也要会减法,并不是把加号换成减号那么简单,还是要动一番脑筋的。

下面先写上我的代码:

#include<stdio.h>
#include<algorithm>
char num1[111], num2[111];
bool compare(char a[], char b[]){
	int len1 = strlen(a);
	int len2 = strlen(b);
	int i, j;
	if(len1 > len2)
		return true;
	else if(len1 == len2){
		for(i = 0; i < len1; i++){
			if(a[i] > b[i])
				return true;
			else if(a[i] < b[i])
				return false;
		}
		return true;
	}
	else
		return false;
}
void reverse(char a[]){
	int i;
	int len = strlen(a);
	int temp;
	for(i = 0; i < len/2; i++){
		temp = a[i];
		a[i] = a[len-1-i];
		a[len-1-i] = temp;
	}
}
void minus(char a[], char b[], char c[]){
	int len1 = strlen(a);
	int len2 = strlen(b);
	int i, j;
	int L = 0;
	reverse(a);
	reverse(b);
	for(i = len2; i < len1; i++)//这一步很关键,初始化
		b[i] = '0';
	for(i = 0; i < len1; i++){
		if(a[i] + L >= b[i]){
		c[i] = a[i] + L - b[i] + '0';
		L = 0;
		}
		else{
			c[i] = (10 - (b[i] - '0')) + a[i] + L;
			L = -1;
		}
	}
	reverse(c);
}
using namespace std;
int main(){
	int i, j;
	while(scanf("%s%s",num1,num2) != EOF){
	int len1 = strlen(num1);
	int len2 = strlen(num2);
	if(compare(num1,num2)){//这里也可以改成strcmp函数对特定情况进行讨论
		minus(num1, num2, num2);
		i = 0;
		while(num2[i] == '0' && i < len1 - 1)//这一步是对应 "a - a = 0"这种情况
			i++;
		for( ; i < len1; i++)
			printf("%c",num2[i]);
	}
	else{
		printf("-");
		minus(num2, num1, num1);
		i = 0;
		while(num1[i] == '0')//这一步是对应"a - b = c < 0, 且 c输出时会有多余的0"的情况,如-001
			i++;
		for( ; i < len2; i++)
			printf("%c",num1[i]);
	}
	printf("\n");
	}
	return 0;
}
以上就是大数的减法。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值