题意:
求a+b。-10^50000<a,b<32768.
分析:
题目描述很猥琐,其实要用高精度的,用高精度加减模板。
代码:
//poj 2756
//sep9
#include <iostream>
using namespace std;
const int maxN=60000;
char A[maxN],B[maxN];
int L,flag1,flag2,flag3,a[maxN],b[maxN],c[maxN];
void ini()
{
L=max(strlen(A),strlen(B))+10;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
flag1=0;
flag2=0;
flag3=0;
if(A[0]=='-') flag1=1;
if(B[0]=='-') flag2=1;
int i,t;
for(t=0,i=strlen(A)-1;i>=0&&A[i]>='0'&&A[i]<='9';--i)
a[t++]=A[i]-'0';
for(t=0,i=strlen(B)-1;i>=0&&B[i]>='0'&&B[i]<='9';--i)
b[t++]=B[i]-'0';
}
void add(int x[],int y[])
{
for(int i=0,p=0;i<=L;++i){
c[i]=x[i]+y[i]+p;
p=c[i]/10;
c[i]=c[i]%10;
}
}
void sub(int x[],int y[])
{
for(int i=0,p=0;i<=L;++i){
c[i]=x[i]-y[i]+p;
if(c[i]<0){
c[i]+=10;
p=-1;
}else
p=0;
}
}
int les(int x[],int y[])
{
for(int i=L;i>=0;--i)
if(x[i]!=y[i])
return x[i]<y[i];
return 0;
}
int main()
{
int cases;
scanf("%d",&cases);
while(cases--){
scanf("%s%s",A,B);
ini();
if(flag1==0&&flag2==0)
add(a,b);
else if(flag1==1&&flag2==1){
add(a,b);
flag3=1;
}else if(flag1==0&&flag2==1){//a-b
if(les(b,a))
sub(a,b);
else{
sub(b,a);
flag3=1;
}
}else{//b-a
if(les(b,a)){
sub(a,b);
flag3=1;
}else
sub(b,a);
}
int i,j;
for(i=L;i>=0;--i)
if(c[i]>0)
break;
if(i<0)
printf("0\n");
else{
if(flag3==1)
printf("-");
for(j=i;j>=0;--j)
printf("%d",c[j]);
printf("\n");
}
}
return 0;
}