大明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专场


解题思路:

1、把数据当作字符串输入。

2、判断小数点的位置。

3、把小数和整数部分分开,并且分别保存在不同的数组里面。

4、先把小数部分依次相加,注意进位。

5、把整数部分依次相加。

6、判断是否有小数部分。

7.输出。。。

注意事项:一定要先加小数,后加整数,因为小数部分也有可能向前进位。

程序代码:

#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]=='.')       // 测出d小数点的位置。

                            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;                     //一定要把变量赋初值 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;          //  十位  向前进 。。。注意:p变量的初值是小数部分的最后一次进位的值(0或 1)

                     else

                            p=0;

              }

             

        if(y[q]>0)                          //判断 整数的最高位是否为0,若不为0  则把数组长度加一。(方便输出)。

                     q=q+1;

              for(i=q-1;i>=0;i--)

              printf("%d",y[i]);               //输出整数部分

              while(x[j-1]==0)                 // 判断小数部分的最后一位是否为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;

}

原文地址:https://www.cnblogs.com/zhouhongweihpu/p/3224359.html