大数加法(小数情况)

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 
这时他已经不是那个只会做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

说真的,= =不得不吐槽一下出题人,题目都说了正的小数A和B,那为什么有整数情况,第一个代码纪念一下把A B都当成小数的情况

#include<stdio.h>
#include<string.h>
char a[401],b[401];
int str1[401],str2[401],str3[401],str4[401],str5[401],str6[401];
int main()
{
    int len1,len2,i,median1,median2,k2,k1,max1,max2;
    while(scanf("%s%s",a,b)!=EOF)
    {
        memset(str1,0,sizeof(str1));
        memset(str2,0,sizeof(str2));
        memset(str3,0,sizeof(str3));
        memset(str4,0,sizeof(str4));
        memset(str5,0,sizeof(str5));
        memset(str6,0,sizeof(str6));
        len1=strlen(a);
        len2=strlen(b);
        for(i=0;i<len1;i++)
            if(a[i]=='.')
              median1=i;
        for(i=0;i<len2;i++)
            if(b[i]=='.')
              median2=i;
        for(i=0;i<median1;i++)
            str1[i]=a[median1-1-i]-'0';
        for(i=0;i<len1-median1-1;i++)
            str2[i]=a[median1+1+i]-'0';
        for(i=0;i<median2;i++)
            str3[i]=b[median2-1-i]-'0';
        for(i=0;i<len2-median2-1;i++)
            str4[i]=b[median2+1+i]-'0';
        if(median1>median2)
            max1=median1;
        else
            max1=median2;
        if(len1-1-median1>len2-1-median2)
            max2=len1-median1-1;
        else
            max2=len2-median2-1;
        k2=0;
        for(i=max2-1;i>=0;i--)
        {
            str5[i]=(str2[i]+str4[i]+k2)%10;
            k2=(str2[i]+str4[i]+k2)/10;
        }
        if(k2!=0)
         str5[max2]=1;
         k1=0;
        for(i=0;i<max1;i++)
        {
            str6[i]=str5[max2]+(str1[i]+str3[i]+k1)%10;
            k1=(str1[i]+str3[i]+k1)/10;
            str5[max2]=0;
        }
        if(k1!=0)
        str6[max1]=1;
        for(i=max1-1;i>=0;i--)
            printf("%d",str6[i]);
           printf(".");
        for(i=0;i<max2;i++)
            printf("%d",str5[i]);
        printf("\n");
    }
    return 0;
}

第二个代码

#include<stdio.h>
#include<string.h>
char a[410],b[410];
int s1[410],s11[410],s2[410],s22[410],s3[410],s33[410];
int main()
{
    int len1,len2,i,j,m1,m2,max1,max2,k;
    while(scanf("%s%s",a,b)!=EOF)
    {
       memset(s1,0,sizeof(s1));
       memset(s11,0,sizeof(s11));
       memset(s2,0,sizeof(s2));
       memset(s22,0,sizeof(s22));
       m1=len1=strlen(a);
       m2=len2=strlen(b);
       for(i=0;i<len1;i++)
        if(a[i]=='.')
          m1=i;
       for(i=0;i<len2;i++)
        if(b[i]=='.')
        m2=i;
       for(i=0,j=m1-1;i<m1;i++,j--)
        s1[i]=a[j]-'0';
       for(i=m1+1,j=0;i<len1;i++,j++)
        s11[j]=a[i]-'0';
       for(i=0,j=m2-1;i<m2;i++,j--)
        s2[i]=b[j]-'0';
       for(i=m2+1,j=0;i<len2;i++,j++)
        s22[j]=b[i]-'0';
        max1=max2=0;
       if(m1>m2)
        max1=m1;
       else
        max1=m2;
       if((len1-m1)>(len2-m2))
        max2=len1-m1;
       else
        max2=len2-m2;
        k=0;
       for(i=max2-1;i>=0;i--)
       {
           s33[i]=(s11[i]+s22[i]+k)%10;
           k=(s22[i]+s11[i]+k)/10;
       }
       for(i=0;i<max1;i++)
       {
           s3[i]=(s1[i]+s2[i]+k)%10;
           k=(s1[i]+s2[i]+k)/10;
       }
       if(k!=0)
        printf("1");
      for(i=max1-1;i>=0;i--)
        printf("%d",s3[i]);
      while(s33[max2-1]==0)
      {
          if(s33[max2-1]==0)
            max2--;
      }
      if(max2>0)
        printf(".");
      for(i=0;i<max2;i++)
        printf("%d",s33[i]);
      printf("\n");
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/narzisen/article/details/80211544
今日推荐