zoukankan      html  css  js  c++  java
  • 大明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;

    }

  • 相关阅读:
    Openjudge 1.3 算数表达式与顺序执行
    Openjudge 1.2 变量定义、赋值并转换
    Openjudge 1.4 逻辑表达式与条件分支
    Openjudge 1.5 循环控制
    Openjudge 1.6 一位数组
    Openjudge 1.8 多维数组
    poj-3134 ida*||记录路径bfs
    wust-1588 日期模拟题
    wust 1599弗洛伊德
    hdu5667 费马小定理加矩阵快速幂
  • 原文地址:https://www.cnblogs.com/zhouhongweihpu/p/3224359.html
Copyright © 2011-2022 走看看