• 杭电 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 }
  • 相关阅读:
    Mysql 系列 | 事务隔离
    Mysql 系列 | 索引(优化器索引选择异常处理)
    Mysql 系列 | count(*)
    K8S入门篇资源调度
    K8S入门篇配置管理
    k8s入门篇资源管理
    k8s入门篇持久化存储管理
    操作crontab
    go Printf 语句的占位符 Format
    go中的 4种 for循环
  • 原文地址:https://www.cnblogs.com/yizhanhaha/p/3072420.html
Copyright © 2020-2023  润新知