大数加法

 

给出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

代码已AChttps://cn.vjudge.net/problem#OJId=All&probNum=&title=%E5%A4%A7%E6%95%B0&source=&category=all

/*原理:同号相加,异号  小置负   再加,符号单独处理,处理情况

1.同号相加最后一次进位

2.异号相减,去除首位0,但需考虑只有一个0的情况

#include<stdio.h>
#include<string.h>
#define max 10005
int add(char a[],char b[]);
int main()
{
	char a[max],b[max];
	scanf("%s%s",a,b);
	add(a,b);
	return 0;
}
int add(char a[],char b[])
{
	int c[max]={0};
	int flag=0,flaga=0,flagb=0,signa=1,signb=1;
	int lena,lenb;
	lena=strlen(a);
	lenb=strlen(b);
	if(a[0]=='-'&&b[0]=='-')//tong hao
	{
		flag=1;
		flaga=flagb=1;//fu hao
	}
	else if(a[0]=='-'||b[0]=='-')//yi hao
	{
		if(a[0]=='-')
			flaga=1;
		else
			flagb=1;
		if(lena-flaga>lenb-flagb)//
			signb=-1;
		else if(lena-flaga<lenb-flagb)//xiao de zhi fu
			    signa=-1;
		else
		{
			int k=strcmp(&a[flaga],&b[flagb]);
			if(k>0)
				signb=-1;
			else if(k<0)
				   signa=-1;
			else
			{
				printf("0\n");
				return 0;
			}
		}
	}
	int i,j,k=0,t=0;//t jin zhi
	for(i=lena-1,j=lenb-1;i>=flaga||j>=flagb;i--,j--)
	{
		if(i>=flaga&&j>=flagb)
			c[k++]=(a[i]-'0')*signa+(b[j]-'0')*signb+t;
		else
		if(i>=flaga&&j<flagb)
			c[k++]=(a[i]-'0')+t;
		else
		if(i<flaga&&j>=flagb)
			c[k++]=(b[j]-'0')+t;
		if(c[k-1]>9)
		{
			t=1;
			c[k-1]-=10;
		}
		else if(c[k-1]<0)
		{
			t=-1;
			c[k-1]+=10;
		}
		else
			t=0;
	}
	if(t==1)
		c[k++]=1;
	while(!c[k]&&k) k--;
	if(flaga&&signb==-1)
		flag=1;
	if(flagb&&signa==-1)
		flag=1;
	if(flag)
		printf("-");
	for(i=k;i>=0;i--)
		printf("%d",c[i]);
	printf("\n");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值