大明A+B

Problem Description

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。

Input

本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

Output

请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。

Sample Input

1.1 2.9

1.1111111111 2.3444323343

1 1.1

Sample Output

4

3.4555434454

2.1

题意描述:

大数相加。

解题思路:

将两个数的小数点对齐,位数补0。进行大数相加。

程序代码:

#include<stdio.h>
#include<string.h>
char a[500],b[500];
int c[500];
int main()
{
	int i,len1,len2,x,y,f,j,len;
	while(scanf("%s%s",a,b)!=EOF)
	{
		len1=strlen(a);
		len2=strlen(b);
		
		//对齐小数点,位数补零 
		f=0;
		for(i=0;i<len1;i++)
			if(a[i]=='.')
			{
				f=1;
				x=i;
				break;
			}
		if(f==0)
		{
			x=len1;
			a[len1]='.';
			a[len1+1]='\0';
			len1=strlen(a);
		}
		f=0;
		for(i=0;i<len2;i++)
			if(b[i]=='.')
			{
				f=1;
				y=i;
				break;
			}
		if(f==0)
		{
			y=len2;
			b[len2]='.';
			b[len2+1]='\0';
			len2=strlen(b);
		}
			
		if((len1-x)>(len2-y))
		{
			for(i=len2;i<len2+((len1-x)-(len2-y));i++)
				b[i]='0';
			b[len2+((len1-x)-(len2-y))]='\0';
			len2=strlen(b);
		}
		if((len2-y)>(len1-x))
		{
			for(i=len1;i<len1+((len2-y)-(len1-x));i++)
				a[i]='0';
			a[len1+((len2-y)-(len1-x))]='\0';
			len1=strlen(a);
		}
		if(x>y)
		{
			for(i=len1;i>=(len1-len2);i--)
			{
				b[i]=b[i-(len1-len2)];
			}
			for(i=len1-len2-1;i>=0;i--)
			{
				b[i]='0';
			}
			len2=strlen(b);
		}
		else
		{
			for(i=len2;i>=(len2-len1);i--)
			{
				a[i]=a[i-(len2-len1)];
			}
			for(i=len2-len1-1;i>=0;i--)
			{
				a[i]='0';
			}
			len1=strlen(a);
		}
		
		
		
		memset(c,0,sizeof(c));
		//两个数都为整数情况 
		if(a[len1-1]=='.')
		{
			j=0;
			for(i=len1-2;i>=0;i--)
			{
				c[j]+=(a[i]-'0')+(b[i]-'0');
				if(c[j]>=10)
				{
					c[j]=c[j]-10;
					c[j+1]++;
				}
				j++;	
			}
			f=0;
			for(i=j;i>=0;i--)
			{
				if(f==0&&c[i]==0)
					continue;
				else
				{
					f=1;
					printf("%d",c[i]);
				}
			}
			printf("\n");
		}
		
		else
		{
			j=0;
			for(i=len1-1;a[i]!='.';i--)
			{
				c[j]+=(a[i]-'0')+(b[i]-'0');
				if(c[j]>=10)
				{
					c[j]=c[j]-10;
					c[j+1]++;
				}
				j++;
			}
			f=i-1;
			if(c[j]==1)
				c[j+1]++;
			c[j]=-1;
			j++;
			for(i=f;i>=0;i--)
			{
				c[j]+=(a[i]-'0')+(b[i]-'0');
				if(c[j]>=10)
				{
					c[j]=c[j]-10;
					c[j+1]++;
				}
				j++;
			}
			len=j;
			
			//去多余0 
			for(i=len;i>=0;i--)
			{
				if(c[i]==0)
					continue;
				else
				{
					len=i;
					break;
				}
			}
			for(i=0;i<=len;i++)
			{
				if(c[i]==0)
					continue;
				else
				{
					f=i;
					break;
				}
			}
			
			// .*** 情况 
			if(c[len]==-1)
				printf("0");
			
			
			for(i=len;i>f;i--)
			{
				if(c[i]!=-1)
					printf("%d",c[i]);
				else
					printf(".");
			}
			if(c[f]!=-1)
				printf("%d",c[f]);
			printf("\n");
		}
	}
	return 0;
}