1. 程式人生 > >【大數加法】【51Nod

【大數加法】【51Nod

題目:

給出2個大整數A,B,計算A+B的結果。

Input

第1行:大數A  第2行:大數B  (A,B的長度 <= 10000 需注意:A B有可能為負數)

Output

輸出A + B

Sample Input

68932147586
468711654886

Sample Output

537643802472
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char aa[100010],bb[100010];
int a[100010],b[100010],c[100010];
int main()
{
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	scanf("%s%s",aa,bb);
	int la=strlen(aa);
	int lb=strlen(bb);

	for(int i=la-1,j=0;i>0;i--)  //反轉字串(不包含 首個字元);
		a[j++]=aa[i]-'0';
 	if(aa[0]=='-')
	{
		for(int i=0;i<la-1;i++) //把 首字元 填入a[]陣列中;
 			a[i]=-a[i];
 	}
 	else
 		a[la-1]=aa[0]-'0';

 	for(int i=lb-1,j=0;i>0;i--)
 		b[j++]=bb[i]-'0';
	if(bb[0]=='-')
 	{
 		for(int i=0;i<lb-1;i++)
 			b[i]=-b[i];
 	}
 	else
 		b[lb-1]=bb[0]-'0';

 	int lc=max(la,lb);
	int p,r=0;
 	for(int i=0;i<lc;i++)
 	{
 		p=a[i]+b[i]+r;
 		r=p/10;
 		c[i]=p%10;
 	}
 	if(r)
 		c[lc++]=r;
 	while(lc>1&&c[lc-1]==0)  //略過 前面的0;
 		lc--;
 	int flag=0;

	if(c[lc-1]>=0)  //A,B相加為正;
 	{
 		flag=1;
 		for(int i=0;i<lc;i++)
 		{
 			while(c[i]<0)
 			{
				c[i+1]--;
 				c[i]+=10;
 			}
 		}
 	}
 	else
 	{
 		flag=-1;
		for(int i=0;i<lc;i++)
 		{
			while(c[i]>0)
 			{
 				c[i+1]++;
 				c[i]-=10;
 			}
 		}
 	}
 	if(flag<0)
 		printf("-");
 	while(lc>1&&c[lc-1]==0)
 		lc--;
 	for(int i=lc-1;i>=0;i--)
 		printf("%d",abs(c[i]));
  	printf("\n");
}