问题 B: A+B【算法笔记:codeup墓地】

题目描述

给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。
现在请计算A+B的结果,并以正常形式输出。

输入

输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。

输出

请计算A+B的结果,并以正常形式输出,每组数据占一行。

样例输入

-234,567,890 123,456,789
1,234 2,345,678

样例输出

-111111101
2346912
#include<stdio.h>
#include<string.h>
#define MAX 50
char STR[MAX][MAX];
void read(char str[],int a[],int *ai,int b[],int *bi);//读取一行字符,并将其转化为数字存放到a,b当中 
void add(int a[],int *ai,int b[],int *bi,int c[],int *ci);
void print(int c[],int ci);
int main()
{
	char str[MAX];
	
	gets(str);
	int n=0;
	while(str[0]!='\0')
	{
		strcpy(STR[n],str);
		n++;
		gets(str);
	}
	
	for(int i=0;i<n;i++)
	{
		int a[MAX]={0},b[MAX]={0},c[MAX]={0};
	    int ai=0,bi=0,ci=0;//记录a,b的长度 
		read(STR[i],a,&ai,b,&bi);
		add(a,&ai,b,&bi,c,&ci);
		print(c,ci); 
		printf("\n");
	}
	return 0;
 } 

void read(char str[],int a[],int *ai,int b[],int *bi)
{
	int i=0;
	int *p,*pos;
	p=a;//记录数组 
	pos=ai;//记录下标 
	while(str[i]!='\0')
	{
		if(str[i]==',')
		{
			i++;
			continue; 
		} 
		else if(str[i]==' ')
		{
			p=b;
			pos=bi;
			i++;
			continue;
		 } 
		 else
		 {
		 	if(str[i]=='-')
		 	{
		 		p[MAX-1]=-1; //最后一位标记符号 
			 }
			 else
		 	{
		 		*(p+(*pos))=str[i]-'0';
		 		(*pos)++;
			 }
		 }
		 i++;
	}
}
void add(int a[],int *ai,int b[],int *bi,int c[],int *ci)
{
	int enter=0;
	
	int start=(*ai)>(*bi)? (*ai-1):(*bi-1);
		//将a,b从低位对齐 
		if(*ai>*bi)
		{
			for(int i=*bi-1;i>=0;i--)
			{
				b[i+(*ai)-(*bi)]=b[i];
			}
			for(int i=0;i<(*ai)-(*bi);i++)
			{
				b[i]=0;
			}
		}
		else if(*ai<*bi)
		{
			for(int i=*ai-1;i>=0;i--)
			{
				a[i+(*bi)-(*ai)]=a[i];
			}
			for(int i=0;i<(*bi)-(*ai);i++)
			{
				a[i]=0;
			}
		}	
	
	if((a[MAX-1]==-1&&b[MAX-1]==-1)||(a[MAX-1]!=-1&&b[MAX-1]!=-1))//同符号相加 
	{
		if(a[MAX-1]==-1) 
		c[MAX-1]=-1;
		
		while(start>=0)
		{
			c[*ci]=(a[start]+b[start]+enter)%10;
			enter=(a[start]+b[start]+enter)/10;
			start--;
			(*ci)++;
		}
	}
	else//异号相加 
	{
		//判断绝对值大小 
		int flag=0;//0代表a的绝对值大,1代表b的绝对值大,2代表相等
		int i; 
		for(i=0;i<=start;i++)
		{
			if(b[i]>a[i])
			{
				flag=1;
				break;
			}
			else if(b[i]<a[i])
			{
				flag=0;
				break;
			}
		}
		if(i==start+1&&flag==0)
		{
			flag=2;
		}
		if((a[MAX-1]==-1&&flag==0)||(b[MAX-1]==-1&&flag==1))
		{
			c[MAX-1]=-1;
		}	
		//计算c的绝对值 
		if(flag==0)
		{
			while(start>=0) 
			{
				if(a[start]>=b[start])
				{
					c[*ci]=a[start]-b[start];
				}
				else
				{
					c[*ci]=a[start]+10-b[start];
					a[start-1]--;
				}
				(*ci)++;
				start--;
			}
		}
		else if(flag==1)
		{
			while(start>=0) 
			{
				if(b[start]>=a[start])
				{
					c[*ci]=b[start]-a[start];
				}
				else
				{
					c[*ci]=b[start]+10-a[start];
					b[start-1]--;
				}
				(*ci)++;
				start--;
			}
		}
	}

} 

void print(int c[],int ci)
{
	if(c[MAX-1]==-1)
	{
		printf("-");
	}
	for(int i=ci-1;i>=0;i--)
	{
		printf("%d",c[i]);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘风xs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值