• hdu 大明A+B


    大明A+B

    Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 44   Accepted Submission(s) : 9

    Font: Times New Roman | Verdana | Georgia

    Font Size:

    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
    

    Author

    linle

    Source

    2007省赛集训队练习赛(6)_linle专场
     
    思路分析:我们可以把输入的两个数据都是正小数。因此通过找小数点把输入的每一个数据分成整数部分和小数部分,我们再整数部分右对齐,采用倒序相加,小数部分如此
     

    #include<stdio.h>
    #include<string.h>
    #define N 500
    int main()
    {
     int n,m,i,j,c[N],d[N],e[N],f[N],x[N],y[N],t,k,s,p,q;
     char a[N],b[N];
     while(scanf("%s %s",a,b)!=EOF)
     {
      memset(c,0,sizeof(c));  //初始化
      memset(d,0,sizeof(d));
      memset(e,0,sizeof(e));
      memset(f,0,sizeof(f));
      t=m=strlen(a);
      k=n=strlen(b);
      for(i=0;i<m;i++)    //找第一个数据的小数点,将小数点的位置
      {
       if(a[i]=='.')
        t=i;
       
      }
      for(i=0;i<n;i++)  ////找第=个数据的小数点,将小数点的位置
      { 
       if(b[i]=='.')
        k=i;
       
      }
      for(i=0,j=t-1;i<t;i++)   
      { c[i]=a[j]-'0';j--;}
      for(i=0,j=k-1;i<k;i++)
      {   d[i]=b[j]-'0';j--;}
      for(i=t+1,j=0;i<m;i++)
      { e[j]=a[i]-'0';j++;}
      for(i=k+1,j=0;i<n;i++)
      { f[j]=b[i]-'0';j++;}
      j=q=0;
      if((m-t)<(n-k))         
       j=n-k;
      else
       j=m-t;
      for(i=j-1,p=0;i>=0;i--)
      {
       x[i]=(e[i]+f[i]+p)%10;
       if(e[i]+f[i]+p>9)
        p=(e[i]+f[i]+p)/10; 
       else
        p=0;
      }
      if(t<k)
       q=k;
      else
       q=t;
      for(i=0;i<=q;i++)
      {
       y[i]=(c[i]+d[i]+p)%10;
       if(c[i]+d[i]+p>9)
        p=(c[i]+d[i]+p)/10;
       else
        p=0;
      }
      
            if(y[q]>0)            //考虑进位
       q=q+1;
      for(i=q-1;i>=0;i--)
      printf("%d",y[i]);
      while(x[j-1]==0)    //消除0
      {
        if(x[j-1]==0)
        j=j-1;
      }


      if(j>0)
       printf(".");
     
      for(i=0;i<j;i++)
       printf("%d",x[i]);

     
      printf(" ");
     }
     return 0;
    }

  • 相关阅读:
    IM开发快速入门(一):什么是IM系统?
    IM群聊消息的已读未读功能在存储空间方面的实现思路探讨
    Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)
    IM开发干货分享:我是如何解决大量离线消息导致客户端卡顿的
    LetsTalk_Android中引导用户加入白名单图-2
    LetsTalk_Android中引导用户加入白名单图
    基于Go的马蜂窝旅游网分布式IM系统技术实践
    2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
    微信团队分享:极致优化,iOS版微信编译速度3倍提升的实践总结
    史上最通俗,彻底搞懂字符乱码问题的本质
  • 原文地址:https://www.cnblogs.com/songmingtao/p/3224360.html
Copyright © 2020-2023  润新知