http://www.
"A+B"
时间限制:1000 ms
|
内存限制:8196 KB
描述
求a+b的和。
输入
第一行为整数n(n<100),表示下面有n组数据。每组数据一行,分别为两个用空格隔开的数a 和 b,a、b为不超过一百位的整数。
输出
对于每组数据,输出一行,即a+b的和。
样例输入
3
1 1
260 260
11 22
样例输出
2
520
33
程序代码:
#include <stdio.h>
#include <string.h>
void format(char *a,int *n)
{
int i = 0,j = 0,k = 0;
bool flag = false;
for(i = 0;i<*n;i++)
if(a[i]!='0' || flag)
{
a[k++] = a[i];
flag = true;
}
if(!flag)
{
memset(a,0,*n);
*n = 1;
return;
}
memset(a+k,0,*n);
i = 0;j = k-1;*n = k;
while(i<=j)
{
char t = a[i]-48;
a[i] = a[j]-48;
a[j] = t;
i++;j--;
}
}
void add(char *a,int *an,char *b,int bn)
{
int i,j,low = 0;
int max = *an>bn?*an:bn;
char t[205] = {0};
for(i = 0;i<max;i++)
{
t[i] = a[i]+b[i]+low;
low = t[i]/10;
t[i] %= 10;
}
if(low)
t[i++] = low;
for(j = 0;j<i;j++)
a[j] = t[j];
*an = i;
}
void sub(char *a,int *an,char *b,int bn)
{
int i,j,k,low = 0;
char t[205] = {0};
for(i = 0;i<*an;i++)
{
t[i] = a[i]-b[i]-low;
if(t[i]<0)
{t[i]+=10;low = 1;}
else low = 0;
}
for(i = *an-1;i>=0;i--)
if(t[i])break;
*an = i+1;
for(;i>=0;i--)
a[i] = t[i];
}
int cmp(char *a,int an,char *b,int bn)
{
if(an != bn)
return an>bn?1:-1;
int i = 0;
for(i = 0;i<an;i++)
if(a[i]>b[i])
return 1;
else if(a[i]<b[i])
return -1;
if(i == an)
return 0;
}
void output(char *a,int an,bool flag)
{
if(*a == 0 && an == 1)
{
printf("0\n");
return ;
}
if(flag) putchar('-');
for(int i = an-1;i>=0;i--)
putchar(a[i]+48);
printf("\n");
}
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--)
{
char a[205] = {0},b[205] = {0};
scanf("%s%s",a,b);
int lena = strlen(a);
int lenb = strlen(b);
if(a[0] == '-' && b[0] == '-')
{
lena--;lenb--;
format(a+1,&lena);
format(b+1,&lenb);
add(a+1,&lena,b+1,lenb);
output(a+1,lena,1);
}
else if(a[0] == '-' && b[0] != '-')
{
lena--;format(a+1,&lena);
format(b,&lenb);
if(cmp(a+1,lena,b,lenb)>0)
{
sub(a+1,&lena,b,lenb);
output(a+1,lena,1);
}
else if(cmp(a+1,lena,b,lenb)<0)
{
sub(b,&lenb,a+1,lena);
output(b,lenb,0);
}
else
printf("0\n");
}
else if(a[0] != '-' && b[0] == '-')
{
lenb--;format(b+1,&lenb);
format(a,&lena);
if(cmp(b+1,lenb,a,lena)>0)
{
sub(b+1,&lenb,a,lena);
output(b+1,lenb,1);
}
else if(cmp(b+1,lenb,a,lena)<0)
{
sub(a,&lena,b+1,lenb);
output(a,lena,0);
}
else
printf("0\n");
}
else
{
format(a,&lena);
format(b,&lenb);
add(a,&lena,b,lenb);
output(a,lena,0);
}
}
return 0;
}
/*
4634524375297459324759793457
-324759237459234509734275987
*/