zoukankan      html  css  js  c++  java
  • 【ACM】hdu_zs1_1005_大明A+B _201307291603

    大明A+B
    Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 30   Accepted Submission(s) : 7
    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


    #include <stdio.h>
    #include <string.h>
    #define MAX_LEN 400
    char str1[MAX_LEN+40];
    char str2[MAX_LEN+40];
    int an1[MAX_LEN+40];
    int an2[MAX_LEN+40];
    int an3[MAX_LEN+40];
    int an4[MAX_LEN+40];
    int main()
    {
     while(scanf("%s%s",str1,str2)!=EOF) 
     {
      int i,j,k,len1,len2;
      memset(an1,0,sizeof(an1));
      memset(an2,0,sizeof(an2));
      memset(an3,0,sizeof(an3));
      memset(an4,0,sizeof(an4));
      len1=strlen(str1);
      for(i=0;(i<len1)&&(str1[i]!='.');i++);
      k=i;
      for(j=0,i=k-1;i>=0;i--)
      an1[j++]=str1[i]-'0';
      for(j=1,i=k+1;i<len1;i++)
      an3[j++]=str1[i]-'0';
      len2=strlen(str2);
      for(i=0;(i<len2)&&(str2[i]!='.');i++);
      k=i;
      for(j=0,i=k-1;i>=0;i--)
      an2[j++]=str2[i]-'0';
      for(j=1,i=k+1;i<len2;i++)
      an4[j++]=str2[i]-'0';
      for(i=MAX_LEN-1;i>=0;i--)
      {
      an3[i]+=an4[i];
      if(an3[i]>=10)
      {
      an3[i]-=10;
      an3[i-1]++;
      }
      }
      if(an3[0]>0)
      an1[0]++;
      for(i=0;i<MAX_LEN;i++)
      {
      an1[i]+=an2[i];
      if(an1[i]>=10)
      {
      an1[i]-=10;
      an1[i+1]++;
      }
      }
      for(i=MAX_LEN;(i>0)&&(an1[i]==0);i--);
      for(;i>=0;i--)
      printf("%d",an1[i]);
      for(i=MAX_LEN;(i>0)&&(an3[i]==0);i--);
      if(i>=1) printf(".");
      for(j=1;j<=i;j++)
      printf("%d",an3[j]);
      printf(" ");
     }
     return 0;
    }

    代码加注释
    #include <stdio.h>
    #include <string.h>
    #define MAX_LEN 400
    char str1[MAX_LEN+40];
    char str2[MAX_LEN+40];
    int an1[MAX_LEN+40];
    int an2[MAX_LEN+40];
    int an3[MAX_LEN+40];
    int an4[MAX_LEN+40];
    int main()
    {
     while(scanf("%s%s",str1,str2)!=EOF) 
     {
      int i,j,k,len1,len2;
      memset(an1,0,sizeof(an1));
      memset(an2,0,sizeof(an2));
      memset(an3,0,sizeof(an3));
      memset(an4,0,sizeof(an4));
      len1=strlen(str1);
      for(i=0;(i<len1)&&(str1[i]!='.');i++);
      k=i;//找出小数点的位置 ,并标记
      for(j=0,i=k-1;i>=0;i--)
      an1[j++]=str1[i]-'0';//处理整数部分
      for(j=1,i=k+1;i<len1;i++)
      an3[j++]=str1[i]-'0';//处理小数部分
      len2=strlen(str2);
      for(i=0;(i<len2)&&(str2[i]!='.');i++);
      k=i;
      for(j=0,i=k-1;i>=0;i--)
      an2[j++]=str2[i]-'0';
      for(j=1,i=k+1;i<len2;i++)
      an4[j++]=str2[i]-'0';
      for(i=MAX_LEN-1;i>=0;i--)
      {
      an3[i]+=an4[i];
      if(an3[i]>=10)
      {
      an3[i]-=10;
      an3[i-1]++;
      }
      }//小数部分相加
      if(an3[0]>0)
      an1[0]++;//小数部分是否要向整数部分进一
      for(i=0;i<MAX_LEN;i++)
      {
      an1[i]+=an2[i];
      if(an1[i]>=10)
      {
      an1[i]-=10;
      an1[i+1]++;
      }
      }//整数部分相加
      for(i=MAX_LEN;(i>0)&&(an1[i]==0);i--);
      for(;i>=0;i--)
      printf("%d",an1[i]);//输出整数部分
      for(i=MAX_LEN;(i>0)&&(an3[i]==0);i--);
      if(i>=1) printf(".");//如果有小数,则输出小数点,如果没有则不输出
      for(j=1;j<=i;j++)
      printf("%d",an3[j]);//输出整数部分
      printf(" ");
     }
     return 0;
    }
    //如输入12.3和34.56,整数部分是21+43,然后倒着输出,小数部分是30+56,从最后的0一直加到最前面,然后正着输出

  • 相关阅读:
    1491: [NOI2007]社交网络
    Ombrophobic Bovines
    1566: [NOI2009]管道取珠
    1564: [NOI2009]二叉查找树
    1497: [NOI2006]最大获利
    mysql数据库修改字段及新增字段脚本
    NIO
    Lombok用法及标签释义
    idea2017.2延长使用时间
    IDEA 注册码
  • 原文地址:https://www.cnblogs.com/xl1027515989/p/3223774.html
Copyright © 2011-2022 走看看