杭电 1753 大明A+B

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
 

 

Recommend
lcy
 
    写了一个正小数相加的函数,然后测试了下,觉得正实数均可通过该函数运算得出结果!
 
View Code
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 int midtemp[405];
  6 
  7 void decimals_add( char *s1, char *s2 )
  8 {
  9      int num1[405], num2[405], len1, len2, i, point1, point2, temp, cnt, j;
 10      //printf( "%s %s\n", s1, s2 );
 11      memset(num1,0,405*sizeof(int));
 12      memset(num2,0,405*sizeof(int)); 
 13      memset(midtemp,0,405*sizeof(int));     
 14      len1 = strlen(s1);
 15      len2 = strlen(s2);
 16      //printf("%d %d\n", len1, len2);
 17      //在小数的小数点后的末尾部分补0,使两小数的小数点后的长度相等 
 18      for( i = len1 - 1; i >= 0; i-- )
 19           if( s1[i] == '.' )
 20               break;
 21      if( i == -1 )
 22      {
 23          point1 = 0;
 24          s1[len1] = '.';
 25          len1 += 1;
 26          s1[len1] = '\0';
 27      }
 28      else
 29          point1 = len1 - 1 - i;
 30      for( i = len2 - 1; i >= 0; i-- )
 31           if( s2[i] == '.' )
 32               break;
 33      if( i == -1 )
 34      {
 35          point2 =0;
 36          s2[len2] = '.';
 37          len2 += 1;
 38          s2[len2] = '\0';
 39      }
 40      else
 41          point2 = len2 - 1 - i;
 42      //printf( "%d %d\n",point1, point2 );
 43      if( point1 > point2 )
 44      {       
 45          temp = point1 - point2;
 46          cnt = len2;
 47          len2 = len2 + temp;
 48          while( temp-- )
 49                 s2[cnt++] = '0';
 50      }
 51      else if( point1 < point2 )
 52      {
 53           temp = point2 - point1;
 54           cnt = len1;
 55           len1 = len1 + temp;
 56           while( temp-- )
 57                  s1[cnt++] = '0';
 58      }
 59      //将小数反转,各个位转换,存储到int型的数组里
 60      //printf("%d %d\n", len1, len2);
 61      cnt = 0;
 62      for( i = len1 - 1; i >= 0; i-- )
 63           if( s1[i] == '.' )
 64               num1[cnt++] = -1;
 65           else
 66               num1[cnt++] = s1[i] - '0';
 67      cnt = 0;
 68      for( i = len2 - 1; i >= 0; i-- )
 69           if( s2[i] == '.' )
 70               num2[cnt++] = -1;
 71           else
 72               num2[cnt++] = s2[i] - '0';
 73      /*for( i = 404; i >= 0; i--  )
 74           if( num1[i] != 0 )
 75               break;
 76      for( i; i >= 0; i-- )
 77           printf( "%d",num1[i] );
 78      printf( "\n" );
 79      for( i = 404; i >= 0; i--  )
 80           if( num2[i] != 0 )
 81               break;
 82      for( i; i >= 0; i-- )
 83           printf( "%d",num2[i] );
 84      printf( "\n" );*/
 85      //相加 
 86      for( i = 0; i < 405; i++ )
 87      {
 88           midtemp[i] += (num1[i] + num2[i]);
 89           if( midtemp[i] >= 10 )
 90           {
 91               if( num1[i+1] == -1 )
 92                   midtemp[i+2]++;
 93               else
 94                   midtemp[i+1]++;
 95               midtemp[i] = midtemp[i] % 10;
 96           }
 97      }
 98     /* for( i = 404; i >= 0; i--  )
 99           if( midtemp[i] != 0 )
100               break;
101      for( i; i >= 0; i-- )
102           printf( "%d",midtemp[i] );
103      printf( "\n" ); */
104      for( i = 404; i >= 0; i-- )
105           if( midtemp[i] != 0 )
106               break;
107      for( j = 0; midtemp[j] != -2; j++ )
108           if( midtemp[j] != 0 )
109               break;
110      if( midtemp[j] == -2 )
111          j++;
112      //printf( "%d %d\n", i, j );
113      for( ; i >= j; i-- )
114           if( midtemp[i] == -2 )
115               printf( "." );
116           else
117               printf( "%c", midtemp[i]+'0' );
118      printf( "\n" );     
119 }
120 
121 int main(int argc, char *argv[])
122 {
123     char a[405], b[405], i;
124     memset(a,0,405*sizeof(char));
125     memset(b,0,405*sizeof(char));
126     while( scanf( "%s %s", a, b ) != EOF )
127     {
128            decimals_add( a, b );
129            memset(a,0,405*sizeof(char));
130            memset(b,0,405*sizeof(char));
131     }
132   
133   //system("PAUSE");    
134   return 0;
135 }

 

posted @ 2013-05-11 09:43  翼展zjz  阅读(149)  评论(0编辑  收藏  举报