码迷,mamicode.com
首页 > 其他好文 > 详细

大明A+B

时间:2015-07-20 14:32:36      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

E - 大明A+B
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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的话,continue,记一下不为0的位置,然后按要求输出即可。
主要思想:我就是把两个数小数点对齐控制,左边的相加,右边的对应相加(位数不同的用0补充,使得左边的位数相同,右面的位数相同。然后右边的先相加,放到result1数组里面,result1控制一下比右边的数长度多1,result1[0]存放进位,result2数组存放左边的数相加的结果,result2[0]存放进位。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
	string a,b;
    int result1[500],result2[500];
	int posa,posb,rgta,lfta,rgtb,lftb,i,k,l,pos,j,flg;
	while(cin>>a>>b)
	{
		pos=0;
		flg=0;
		memset(result1,0,sizeof(result1));
		memset(result2,0,sizeof(result2));
		if(a.find(".")==-1)
		{  
			posa=a.size();
			a=a+".";
		}
		else
		 posa=a.find(".");
	   if(b.find(".")==-1)
	   {
		   posb=b.size();
	   	   b=b+".";  //123456789.
	   	
	   }
	   else
	     posb=b.find(".");//  23498.78998
	     rgta=a.size()-posa-1;
	     rgtb=b.size()-posb-1;
	     lfta=posa;
	     lftb=posb;
	     if(rgta>rgtb)
	       {
	       	   for(i=1;i<=rgta-rgtb;i++)
	       	     b=b+"0";
	       	    rgtb=rgta;
	       }
	       else if(rgta<rgtb)
	       {
	       	 for(i=1;i<=rgtb-rgta;i++)
	       	    a=a+"0";
	       	    rgta=rgtb;
	       }
	       if(lfta>lftb)
	         {
	         	for(i=1;i<=lfta-lftb;i++)
	         	 //b.insert(0,'0');
				 b='0'+b;
	         	lftb=lfta;
	         	posb=posa;
	         }
	         else if(lfta<lftb)
	          {
	         	for(i=1;i<=lftb-lfta;i++)
	         //	a.insert(0,'0');
			      a='0'+a;
	         	lfta=lftb;
	         	posa=posb;
	         }
	         k=rgta;
	         for(i=a.size()-1;i>posa;i--)
	       {
	       	   result1[k]=(a[i]-'0')+(b[i]-'0');
	       	   k--;
	       }
	       for(i=rgta;i>=1;i--)
	       {
	       	  result1[i-1]=result1[i-1]+result1[i]/10;
	       	  result1[i]=result1[i]%10;
	       }
	         k=lfta;
	         for(i=lfta-1;i>=0;i--)
	         {
	            result2[k]=(a[i]-'0')+(b[i]-'0');
				k--;	
	         }
	       for(i=lfta;i>=1;i--)
	       {
	       	  result2[i-1]=result2[i-1]+result2[i]/10;
	       	  result2[i]=result2[i]%10;
	       }
	       if(result1[0]!=0)
	       {
	       	   result2[lfta]+=result1[0];
	       	   if(result2[lfta]>=10)
	       	     {
	       	     	 for(i=lfta;i>=1;i--)
	                {
	       	                result2[i-1]=result2[i-1]+result2[i]/10;
	       	                result2[i]=result2[i]%10;
	       	                 if(result2[i-1]<10)
	       	                   break;
	                 }
	       	     }
	       }
		   int l=0;
	       if(result2[0]==0)
	       {
	       	  for(i=1;i<=lfta;i++)
	       	   cout<<result2[i];
               for(i=rgta;i>=1;i--)
			   {
				   if(result1[i]==0)
					   continue;
				   else
				   {
					   flg=1;
					   pos=i;
					   break;
				   }
			   }
			     if(flg)
				   cout<<".";
			   for(i=1;i<=pos;i++)
				   cout<<result1[i];
				  cout<<endl;
	       }
	       else
	       {
		      for(i=0;i<=lfta;i++)
	       	   cout<<result2[i];
	       	   for(i=rgta;i>=1;i--)
			   {
				   if(result1[i]==0)
					   continue;
				   else
				   {
					   flg=1;
					   pos=i;
					   break;
				   }
			   }
			   if(flg)
				   cout<<".";
			   for(i=1;i<=pos;i++)
				   cout<<result1[i];
				  cout<<endl;
	       }
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

大明A+B

标签:

原文地址:http://blog.csdn.net/zuguodexiaoguoabc/article/details/46966803

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!