比赛描述
“不甘心!”,大魔王和阿汤哥的比试中又输了,他现在抓来了又胖又肥(好像一个意思)峰哥,这次他不会让他逃走了。
“啊,咯吱咯吱,想不到这个胖子还挺脆挺好吃的。”
输入
第一行,输入一个正整数 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; } }