首页 > 代码库 > poj 2756 Autumn is a Genius 高精度加减

poj 2756 Autumn is a Genius 高精度加减

题意:

求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 高精度加减