大数相加(分正负数)

给出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>
#define N 10005
int a1[N],a2[N];
char s1[N],s2[N];
int main()
{
	int i,j,l;
	int f1=0,f2=0;//判断正负0正,1负 
	scanf("%s %s",&s1,&s2);
	int l1 = strlen(s1);
	int l2 = strlen(s2);
	if (s1[0]=='0' && s2[0]=='0')
		printf("0\n");
	else
	{
		if (s1[0]=='-')
		{
			f1 = 1;	//标记是否为负数  
			for (i=l1-1,j=0;i>0;i--,j++)
				a1[j] = s1[i] - '0';
		}
		else
			for (i=l1-1,j=0;i>=0;i--,j++)
				a1[j] = s1[i] - '0';
		if (s2[0]=='-')
		{
			f2 = 1;	//标记是否为负数  
			for (i=l2-1,j=0;i>0;i--,j++)
				a2[j] = s2[i] - '0';
		}
		else
			for (i=l2-1,j=0;i>=0;i--,j++)
				a2[j] = s2[i] - '0';
		//CASE 1	全为正;	
		if (!f1 && !f2)
		{
			if (l1>l2)	l = l1;
			else			l = l2;
			for (i=0;i<l;i++)
			{
				a1[i] += a2[i];
				if (a1[i]>9)
				{
					a1[i] -= 10;
					a1[i+1]++;
				}
			}
			while (!a1[l])	l--;
				for (;l>=0;l--)
					printf("%d",a1[l]);
			printf("\n");	
		}
		//CSSE 2	一负一正 
		else if (f1 && !f2)//s1为负数,s2为正数 
		{	
			int ans = 0;//默认正数大于负数 
			if (l1-1>l2)	ans = 1; //负数大于正数 
			else if (l1-l2==1)
			{
				for (i=l1-2;i>=0;i--)
					if (a1[i]>a2[i])
					{
						ans = 1;
						break;
					} 
					else
						break;
			}
			if (ans)
			{
				printf("-");
				for (i=0;i<l1;i++)
				{
					a1[i] -= a2[i];
					if (a1[i]<0)
					{
						a1[i] += 10;
						a1[i+1]--;
					}
				}
				while (!a1[l1])	l1--;
				for (;l1>=0;l1--)
					printf("%d",a1[l1]);
				printf("\n");
			}
			else
			{
				for (i=0;i<l2;i++)
				{
					a2[i] -= a1[i];
					if (a2[i]<0)
					{
						a2[i] += 10;
						a2[i+1]--;
					}
				}
				while (!a2[l2])  l2--;
				if (l2<0)
					printf("0");//说明两数相等
				else
					for (;l2>=0;l2--)
						printf("%d",a2[l2]);
				printf("\n");	
			}
		}
		//CASE 3	一正一负 
		else if (!f1 && f2)//s1为正数,s2为负 
		{	
			int ans = 0;//默认正数大于负数 
			if (l2-1>l1)	ans = 1; //负数大于正数 
			else if (l2-l1==1)
			{
				for (i=l1-1;i>=0;i--)
					if (a2[i]>a1[i])
					{
						ans = 1;
						break;
					} 
					else
						break;
			}
			if (ans)
			{
				printf("-");
				for (i=0;i<l2-1;i++)
				{
					a2[i] -= a1[i];
					if (a2[i]<0)
					{
						a2[i] += 10;
						a2[i+1]--;
					}
				}
				while (!a2[l2])  l2--;
				for (;l2>=0;l2--)
					printf("%d",a2[l2]);
				printf("\n");
			}
			else
			{
				for (i=0;i<l1;i++)
				{
					a1[i] -= a2[i];
					if (a1[i]<0)
					{
						a1[i] += 10;
						a1[i+1]--;
					}
				}
				while (!a1[l1])  l1--;
				if (l1<0)
					printf("0");//说明两数相等
				else
					for (;l1>=0;l1--)
						printf("%d",a1[l1]);
				printf("\n");
			}
		}
		//CSSE 4  全为负
		else
		{
			if (l1>l2)	l = l1;
			else			l = l2;
			for (i=0;i<l;i++)
			{
				a1[i] += a2[i];
				if (a1[i]>9)
				{
					a1[i] -= 10;
					a1[i+1]++;
				}
			}
			printf("-");
			while (!a1[l])	l--;
				for (;l>=0;l--)
					printf("%d",a1[l]);
			printf("\n");	
		}
	}
	return 0;
}

 
 

猜你喜欢

转载自blog.csdn.net/qq_40912854/article/details/80344341
今日推荐