南邮 OJ 2098 3_A+B(III)

3_A+B(III)

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 203            测试通过 : 12 

比赛描述

“不甘心!”,大魔王和阿汤哥的比试中又输了,他现在抓来了又胖又肥(好像一个意思)峰哥,这次他不会让他逃走了。


    “啊,咯吱咯吱,想不到这个胖子还挺脆挺好吃的。”




输入

第一行,输入一个正整数 T (1<=T<=30)

然后有T行,每行两个整数 a 和 b  (a和b的位数都保证在10000位以内~)


输出

对于每对 a和b,输出 a+b 的结果

样例输入

5
1 2
-5 3
1 -1
-1111111111111 2222222222222
23333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 -3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

样例输出

3
-2
0
1111111111111
20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

题目来源

NUPT






#include<iostream>
#define N 10005
using namespace std;

char num1[N];
char num2[N];
char result[N];

void reverse(char num[], int len){
	for(int i = 0; 2*i<len; ++i){
		swap(num[i],num[len-1-i]);
	}
}

//输入同时为正,结果肯定为正
void realadd(char *num1, char *num2, char *result){
	int len1 = (int)strlen(num1), len2 = (int)strlen(num2);
	int lenresult = max(len1,len2);
	int i;
	int carry = 0;
	for(i=len1;i<lenresult;i++){
		num1[i] = '0';
	}
	for(i=len2;i<lenresult;i++){
		num2[i] = '0';
	}
	for(i=0;i<lenresult;++i){
		result[i] = num1[i] - '0' + num2[i] + carry;
		if(result[i]>'9'){
			result[i] -= 10;
			carry = 1;
		}else{
			carry = 0;
		}
	}
	if(carry){
		result[lenresult] = '1';
		lenresult ++;
	}
	result[lenresult] = '\0';	
}
//输入同时为正,num1>num2,结果一定为正
void realminus (char *num1,char *num2, char *result){
	int len1 = (int)strlen(num1), len2 = (int)strlen(num2);
	int i;
	int borrow = 0;
	for(i = 0; i<len2; ++i){
		result[i] = num1[i]-num2[i]-borrow;
		if(result[i]<0){
			result[i] += 10;
			borrow = 1;
		}else{
			borrow = 0;
		}
		result[i] += '0';
	}
	for(; i<len1; ++i){
		result[i] = num1[i]-borrow-'0';
		if(result[i]<0){
			result[i] += 10;
			borrow = 1;
		}else{
			borrow = 0;
		}
		result[i] += '0';
	}
	i--;
	while(result[i]=='0'){
		i--;
	}
	i++;
	result[i] = '\0';
}

//输入同时为正,结果可正可负
void minus1 (char *num1,char *num2, char *result){
	int len1 = (int)strlen(num1), len2 = (int)strlen(num2);
	int lenresult,i;
	int num1_minus_num2;			//标志num1-num2的正负
	if(len1<len2){
		num1_minus_num2 = -1;
	}else if(len1>len2){
		num1_minus_num2 = 1;
	}else{
		for(i=len1-1; i>=0 && num1[i]==num2[i]; --i){	
			;						//从最高位开始比较
		}
		if(i<0){
			num1_minus_num2 = 0;	//一样大
		}else if(num1[i]>num2[i]){
			num1_minus_num2 = 1;	//num1大
		}else{
			num1_minus_num2 = -1;	//num2大
		}
	}
	if(num1_minus_num2==0){
		result[0] = '0';
		result[1] = 0;
	}else if(num1_minus_num2>0){
		realminus(num1,num2,result);
	}else{
		realminus(num2,num1,result);
		lenresult = (int)strlen(result);
		result[lenresult] = '-';
		lenresult++;
		result[lenresult] = '\0';
	}
}

void add (char *num1, char *num2, char *result){
	int num1neg=0,num2neg=0,resultneg=0;
	int i = 0, j = 0, len1 = (int)strlen(num1), len2 = (int)strlen(num2),lenresult;
	reverse(num1,len1);
	reverse(num2,len2);				//先翻转,这样有负号就不用移动了
	if(num1[len1-1]=='-'){		//去掉负号,全部转化为正数
		num1neg = 1;
		len1--;
		num1[len1] = '\0';
	}
	if(num2[len2-1]=='-'){
		num2neg = 1;
		len2--;
		num2[len2] = '\0';
	}
	if(num1neg == num2neg){
		resultneg = num1neg;	//同+或同-
		realadd(num1,num2,result);
		lenresult = (int)strlen(result);
		if(resultneg){
			result[lenresult] = '-';
			lenresult++;
			result[lenresult] = '\0';
		}
	}else{
		if(num2neg){			//num1-num2
			minus1(num1,num2,result);
		}else{					//num2-num1
			minus1(num2,num1,result);
		}
	}
	lenresult = (int)strlen(result);
	reverse(result,lenresult);
}

int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("\n%s %s",num1,num2);
		add(num1,num2,result);
		cout<<result<<endl;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值