请大家帮忙测试测试结果哪还有错误,哪种情况还算错。先行谢过!:D
Description
Please calculate the answer of A+B and the answer of A-B, both A and B are integer.
Input
The first line of input contains T(1 < T < 1000), the number of test cases. There is only line for each test case. It contains two integers A,B(-10^1000 < A,B < 10^{1000}).
Output
For each test case, output two lines A+B and A-B.
Sample Input
3
1 2
1 1
-1 -1
Sample Output
3
-1
2
0
-2
0
我的代码:
代码: 全选
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MAX 9000
char result[MAX];
int i = 0;
enum {PASS, MINUS};
int sum(char *,char *,int);
int ro(char *);
void free_result();
char *clear_zero(char *e);
int main()
{
char fir[MAX];
char sec[MAX];
char thr[MAX];
char *e1,*e2,*chg;
int l1,l2,len;
int cases;
int get_minus,swap;
int j;
int neg_print_minus;
int pattern;
int get_negative;
int onebig;
int e1_minus, e2_minus, dminus;
scanf("%d",&cases);
while(cases--)
{
e1 = fir;
e2 = sec;
neg_print_minus = 0;
onebig = 1;
e1_minus = 0; e2_minus = 0; dminus = 0;
scanf("%s%s",e1,e2);
if (*e1 == '-' || *e2 == '-') {
if ( *e1 == '-' && *e2 == '-'){
++e1;
++e2;
dminus = 1;
} else if (*e1 == '-') {
++e1;
e1_minus = 1;
} else if (*e2 == '-') {
++e2;
e2_minus = 1;
}
get_negative = 1;
} else
get_negative = 0;
e1 = clear_zero(e1);
e2 = clear_zero(e2);
if (*e1 == '0' && *e2 == '0') {
printf("0\n0\n");
continue;
}
l1 = strlen(e1);
l2 = strlen(e2);
len = l1 - l2;
onebig = 1;
get_minus = (len <= 0 && strcmp(e1,e2) < 0) ? 1 : 0;
if (len < 0 || get_minus) {
swap = 1;
onebig = 0;
chg = e1; e1 = e2; e2 = chg;
len = -len;
} else
swap = 0;
if (len != 0) {
for (j = 0; thr[j] != '\0'; ++j)
thr[j] = '\0';
while (len--)
thr[len] = '0';
//printf("len: %d,thr:%s\n",len,thr);
e2 = strcat(thr,e2);
//printf("e2:%s\n",e2);
} else
neg_print_minus = 0;
for (pattern = PASS,j = 0;j < 2; j++, pattern = MINUS) {
if (get_negative && !dminus)
pattern = (pattern == MINUS) ? PASS : MINUS;
//printf("~~ongbig:%d,dminus:%d,pattern:%d~~",onebig,dminus,pattern);
if (strcmp(e1,e2) == 0 && pattern == MINUS)
neg_print_minus = 0;
else if (dminus && !(onebig == 0 && pattern == MINUS)) {
neg_print_minus = 1;
//printf("~do1~:");
} else if (onebig == 0 && e1_minus && pattern == PASS) {
neg_print_minus = 1;
//printf("~do2~:");
} else if (onebig == 0 && e2_minus && pattern == MINUS) {
neg_print_minus = 1;
//printf("~do2.1~:");
} else if (onebig && e1_minus) {
neg_print_minus = 1;
//printf("~do3~:");
} else
neg_print_minus = 0;
if(sum(e1,e2,pattern))
strcat(result,"1");
if (get_negative == 0 && pattern == MINUS && (get_minus || swap))
printf("-");
if (get_negative && neg_print_minus)
printf("-");
if(ro(result) == 1)
printf("0");
printf("\n");
free_result();
}
}
return 0;
}
int sum(char *e1, char *e2,int pattern)
{
int re = 0;
int carry = 0;
if (*e1 == '\0' && *e2 == '\0')
return 0;
else
carry = sum(++e1,++e2,pattern);
--e1;
--e2;
if (pattern == MINUS ) {
if ((re = (*e1 - '0') - carry - (*e2 - '0')) < 0) {
result[i++] = re + 10 + '0';
return 1;
} else
result[i++] = re + '0';
} else if (pattern == PASS) {
if ((re = (*e1 - '0') + carry + (*e2 - '0')) >= 10) {
result[i++] = re - 10 + '0';
return 1;
} else
result[i++] = re + '0';
result[i] = '\0';
}
return 0;
}
int ro(char *in) {
static int iszero = 0;
int jzero;
if (*in == '\0')
return 1;
else
jzero = ro(++in);
--in;
if (jzero) {
if (*in == '0')
iszero = 1;
else {
jzero = 0;
iszero = 0;
}
}
if (!iszero)
printf("%c",*in);
return jzero;
}
void free_result()
{
i = 0;
while (result[i] != '\0')
result[i++] = '\0';
i = 0;
}
char *clear_zero(char *e)
{
if (*e == '0')
while (*++e == '0' && *e == '\0')
;
if (*e == '\0')
*--e = '0';
return e;
}