大数减法

/*输入两行字符串正整数,第一行是被减数,第二行是减数,输出第一行减去第二行的结果。  
*/
#include <iostream>
#include <string.h>
using namespace std;


//char a[1001];
//char b[1001];


void bigPlus(char *a, char *b, bool flag)
{
	// a = "123456" b= "43"
	char result[1002];
	int temp = 0;
	int i,j,diff;
	diff = strlen(a) - strlen(b);


	for(i=strlen(a)-1,j=0; (i-diff)>=0; i--){
		int s = (a[i]-'0')+(b[i-diff]-'0')+temp;
		result[j++] =s%10+'0';
		temp = s/10;
	}	


	for(; i>=0; i--){
		int s = a[i]-'0' + temp;
		result[j++] =s%10+'0';
		temp = s/10;
	}


	if(temp > 0)
     	result[j++] = temp+'0';
	if(!flag) result[j++] = '-';


	for(i=j-1; i>=0; i--)
		cout<<result[i];
}


void bigMinus(char *a, char *b, bool flag)
{
	char result[1002];
	


	int alength = strlen(a);
	int blength = strlen(b);


	int temp = 0;
	int i,j,diff,p;
	diff = strlen(a) - strlen(b);


	for(i=alength-1,j=0; (i-diff)>=0; i--){
		int s = (a[i]-'0')- (b[i-diff]-'0');
		if(s<0){
			p = i-1;
			while(a[p] == '0' && p>=0) p--;
			a[p] = a[p]-'1'+'0';
			p++;
			while(p != i){
				a[p] = '9';
				p++;
			}


			s += 10;
		}
		result[j++] = s+'0';
	}


	for(; i>=0; i--){
		if(i==0 && a[i]=='0') break;
		else
			result[j++] = a[i];
	}


	if(!flag){
		while(result[j-1] == '0'){
			result[j-1] = '\0';
			j=j-1;
		}
		result[j++] = '-';
		result[j] = '\0';
	}else{
		j--;
		while(result[j] == '0'){
			result[j] = '\0';
			j--;
		}
		j++;
		result[j] = '\0';
	}


 //   cout<<strlen(result)<<endl;
//	if(flag)
	     for(i=strlen(result)-1; i>=0; i--) cout<<result[i];
//	else
//		 for(i=j-1; i>=0; i--) cout<<result[i];
	cout<<endl;




}
void select(char *a, char *b)
{
	int alength = strlen(a);
	int blength = strlen(b);




	if(alength > blength){
			bigMinus(a,b,true);
	}else if(alength == blength){
		if(strcmp(a,b) == 1) bigMinus(a,b, true);
		else if(strcmp(a,b) == 0) cout<<'0'<<endl;
		else bigMinus(b,a, false);
	}else{
		bigMinus(b,a,false);
	}
}








int main()
{
	while(true){
	char a[1001];
    char b[1001];
	cin >> a;
	cin >> b;


	int alength = strlen(a);
	int blength = strlen(b);
    
	bool flag = true;


	if(a[0] != '-' && b[0] == '-'){//a-(-b)
		if(alength >= (blength-1))
			bigPlus(a,b+1, true);
		else
			bigPlus(b+1,a,true);
	}else if(a[0] == '-' && b[0] != '-'){//-a-b
		if((alength-1) >= blength)
			bigPlus(a+1,b, false);
		else
			bigPlus(b,a+1, false);
	}else if(a[0] != '-' && b[0] != '-'){//a-b
		select(a,b);	
	}else{//-a-(-b)
		select(b+1,a+1);
	}
	}
	//cout<<a+1<<endl;


	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值