hoj 1753 大明A+B

来源:互联网 发布:怎么查看淘宝消费总额 编辑:程序博客网 时间:2024/05/06 13:17

大明A+B

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4823    Accepted Submission(s): 1592


Problem 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
 

Author
linle
 

Source
2007省赛集训队练习赛(6)_linle专场
 

Recommend
lcy
这道题太多纠结
上几组测试数据吧
0  0
0000 000000
0000002 00003
9999.99 0.01
99999 1.0
99.0000000 1.00
999999999999 1
思路大家都有就是细心去编程了


#include<stdio.h>
#include<string.h>
int main()
{
       int  a[1000],b[1000],c[1000],i,j,k1,k2,d[1000],e[1000],f[1000],i1,i2,j1,flag1,flag2,i11,i12,t,flag,flag3,num;
      char st1[1000],st2[1000];
      while(scanf("%s%s",st1,st2)!=EOF)
   {
    i1=0;i2=0;
          memset(d,0,sizeof(d));
          memset(e,0,sizeof(e));
          memset(f,0,sizeof(f));
         memset(a,0,sizeof(a));
          memset(b,0,sizeof(b));
          memset(c,0,sizeof(c));
             k1=strlen(st1);
             k2=strlen(st2);
         for(i=0;i<=k1-1&&st1[i]!='.';i++)
              a[i]=st1[i]-'0';
               i11=i;
                 i++;
          flag1=1;
         for(i1=0;i<=k1-1;i++,i1++)
   {
          d[i1]=st1[i]-'0';
           flag1=0;
   }
          for(i=0;i<(i11)/2;i++)
    {
          t=a[i];
       a[i]=a[i11-i-1];
       a[i11-i-1]=t;
    }
 
 

 

        for(i=0;i<=k2-1&&st2[i]!='.';i++)
         b[i]=st2[i]-'0';
           i12=i;
            i++;
        flag2=1;
         for(i2=0;i<=k2-1;i++,i2++)
   {
        e[i2]=st2[i]-'0';flag2=0;
   }
         for(i=0;i<(i12)/2;i++)
   {
          t=b[i];
       b[i]=b[i12-i-1];
       b[i12-i-1]=t;
   }
 

 

        for(i=0;i<=i1-1||i<=i2-1;i++)
      f[i]=d[i]+e[i];
          j=i;
    num=j;
       for(j=i;j>=1;j--)
     if(f[j]>9) 
  {
     f[j-1]+=1;
     f[j]=f[j]-10;
  }
  i=j;
 

     flag=0;
       if(num!=0)
    {
    if(f[0]>9)
    {f[0]=f[0]-10;flag=1;}
    }
  while(f[num-1]==0&&num>0)
  {
   num--;
 
  }
        if(flag==1) a[0]+=1;
     
        if(flag1==0)
          k1=k1-i1-1;
        if(flag2==0)
          k2=k2-i2-1;
         for(i=0;i<=k1-1&&i<=k2-1;i++)
       c[i]=a[i]+b[i];
        j=i;
         if(k1>k2)
        for(j=i;j<=k1-1;j++)
        c[j]=a[j];
          else
          for(j=i;j<=k2-1;j++)
          c[j]=b[j];
        for(i=0;i<=j-2;i++)
       if(c[i]>9)
    {  c[i]=c[i]-10;  c[i+1]+=1;}
    

        i=j-1;
  while(c[i]==0&&i>0)
  {
   j--;
   i--;
  }
        for(i=j-1;i>=0;i--)
       printf("%d",c[i]);
  flag3=0;
         if(num==1&&f[0]==0)
    flag3=1;
   if(num==0)
   {
    flag3=1;
   }
         if((i1>0||i2>0)&&flag3==0)
   {
        printf(".");
      for(i=0;i<num;i++)
     printf("%d",f[i]);
   }
         printf("\n");
    }
 return 0;
}


 

 
原创粉丝点击