任意长度的正小数的加法(YT新人之巅峰大决战05)

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

#include<iostream>

using namespace std;
void shuchu(char *a,int m1,int t1,int t2)
{int i;
	for(i=799;i>=0;i--)
			if(i!=m1)
			
			if(a[i]>'9'&&i!=0)
			{
				if(i==m1+1)
				{a[i]=a[i]-10;
				a[i-2]++;}
				else
				{

				a[i]=a[i]-10;
				a[i-1]++;
				}
			}
				if(a[i]>'9'&&i==0)
		{a[i]-=10;cout<<1;}	
		for(i=0;i<t1||i<t2;i++)
		{
			if(i==m1)
				cout<<'.';
			else
			cout<<a[i];
			
		}
	
}
int main()
{  char a[800],b[800];
int t1,t2,m1,m2,n=0,i,i1,k1,k2;
while (cin>>a>>b)
{	t1=strlen(a);
    t2=strlen(b);
	for(i=t1;i<800;i++)
		if((a[i]<'0'||a[i]>'9')&&a[i]!='.')
		a[i]=NULL;
	for(i=t2;i<800;i++)
		if((b[i]<'0'||b[i]>'9')&&b[i]!='.')
		b[i]=NULL;
		m1=0;
	m2=0;
	
	for(i=0;i<t1;i++)
	{
		if(a[i]=='.')
		{
			m1=i;
			break;
		}
	}

	

	for(i=0;i<t2;i++)
	{
		if(b[i]=='.')
		{
			m2=i;
			break;
		}
	}
	k1=m1;
	k2=m2;


	if(m1>=m2&&m2!=0)
	{
		for(k1--,k2--;k1>=0&&k2>=0;k1--,k2--)
		a[k1]=a[k1]+b[k2]-48;
		k1=m1;
	k2=m2;
		for(k1++,k2++;k1<t1||k2<t2;k1++,k2++)
			a[k1]=a[k1]+b[k2]-48;

	 shuchu(a,m1, t1, t2);



	
	}


	if(m2>m1&&m1!=0)
	{
		for(k1--,k2--;k1>=0&&k2>=0;k1--,k2--)
		b[k2]=a[k1]+b[k2]-48;
		k1=m1;
	k2=m2;
		for(k1++,k2++;k1<t1||k2<t2;k1++,k2++)
			b[k2]=a[k1]+b[k2]-48;

		shuchu(b,m2, t1, t2);



	
	}
	if(m1==0&&m2!=0)
		if(t1<=m2)
		{	for(t1--,k2--;t1>=0;t1--,k2--)
				b[k2]=b[k2]+a[t1]-48;
				for(i=799;i>=0;i--)
			shuchu(b,m2, t1, t2);
		}
		else
		{k1=t1;
			for(k1--,k2--;k2>=0;k1--,k2--)
				a[k1]=b[k2]+a[k1]-48;
			k1=t1;
			k2=m2;
			for(;k1<800;k1++,k2++)
				a[k1]=b[k2];
				for(i=799;i>=0;i--)
			shuchu(a,m1, t1, t2);
		}



		if(m2==0&&m1!=0)
		if(t2<=m1)
		{	for(t2--,k1--;t2>=0;t2--,k1--)
				a[k1]=b[t1]+a[k1]-48;//////////////////////////////
				for(i=799;i>=0;i--)
			shuchu(a,m1, t1, t2);
		}
		else
		{k2=t2;
			for(k1--,k2--;k2>=0;k1--,k2--)
				b[k2]=a[k1]+b[k2]-48;
			k2=t2;
			k1=m1;
			for(;k2<800;k2++,k1++)
				b[k2]=a[k1];
				for(i=799;i>=0;i--)
			shuchu(b,m2, t1, t2);
		}
		if(m1==m2&&m2==0)
		{
			if(t1>t2)
			{
				m1=t1;m2=t2;
				for(m1--,m2--;m2>=0;m1--,m2--)
					a[m1]=a[m1]+b[m2]-48;
				for(i=799;i>=0;i--)
				{if(a[i]>'9'&&i!=0)
					{a[i]=a[i]-10;a[i-1]++;}
					if(a[i]>'9'&&i==0)
					{a[i]=a[i]-10;cout<<1;}}
					for(i=0;i<t1;i++)
				
						cout<<a[i];
			}
					if(t2>=t1)
			{
				m2=t2;m1=t1;
				for(m1--,m2--;m1>=0;m1--,m2--)
					b[m2]=a[m1]+b[m2]-48;
				for(i=799;i>=0;i--)
				{if(b[i]>'9'&&i!=0)
					{b[i]=b[i]-10;b[i-1]++;}
					if(b[i]>'9'&&i==0)
					{b[i]=b[i]-10;cout<<1;}
				}
					for(i=0;i<t2;i++)
						cout<<b[i];

			
					}	
		
		
		}

	}
return 0;
}


原文地址:https://www.cnblogs.com/oversea201405/p/3767035.html