题意:
求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; }
poj 2756 Autumn is a Genius 高精度加减
原文地址:http://blog.csdn.net/sepnine/article/details/43271241