大明A+B

来源:互联网 发布:mac上好用的编程软件 编辑:程序博客网 时间:2024/06/08 04:45
E - 大明A+B
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

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

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

Input

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

Output

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

Sample Input

1.1 2.91.1111111111 2.34443233431 1.1
 

Sample Output

43.45554344542.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;}
0 0