• [九度OJ]1137.浮点数加法


    原题链接:http://ac.jobdu.com/problem.php?pid=1137

    题目描述:

    求2个浮点数相加的和
    题目中输入输出中出现浮点数都有如下的形式:
    P1P2...Pi.Q1Q2...Qj
    对于整数部分,P1P2...Pi是一个非负整数
    对于小数部分,Qj不等于0

    输入:

    对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
    每组测试数据之间有一个空行,每行数据不超过100个字符

    输出:

    每组案例是n行,每组测试数据有一行输出是相应的和。
    输出保证一定是一个小数部分不为0的浮点数

    样例输入:
    2
    0.111111111111111111111111111111
    0.111111111111111111111111111111
    
    10000000.655555555555555555555555555555
    1.444444444444444444444444444445
    样例输出:
    0.222222222222222222222222222222
    10000002.1
    题解:
      我的做法是去小数点,即统一乘以10n次方,这个n是两个数中小数点位数较大的一个,然后用大数相加,最后再把小数点加上,多余的0去掉。代码如下:
      1 #include <cstdio>
      2 #include <string.h>
      3 #include <stdlib.h>
      4 using namespace std;
      5 int n;
      6 char a[105];
      7 char b[105];
      8 char c[105];
      9  
     10 int remove(char* a,char c){
     11      char *p;
     12      int pos=0;
     13      int i;
     14      for(p=a,i=strlen(a)-1; *p!=''; p++,i--){
     15          if(*p==c){
     16               pos = i;
     17               char* q;
     18               for(q=p;*q!=''; q++){
     19                   *q = *(q+1);
     20               }
     21          }
     22      }
     23      return pos;
     24 }
     25  
     26 void add(char* a,char* b,char* c)
     27 {
     28     int i,j,k,max,min,n,temp;
     29     char *s,*pmax,*pmin;
     30       
     31     max=strlen(a);
     32     min=strlen(b);
     33   
     34     if (max<min)
     35     {
     36         temp=max;
     37         max=min;
     38         min=temp;
     39         pmax=b;
     40         pmin=a;
     41     }
     42     else
     43     {
     44         pmax=a;
     45         pmin=b;
     46     }
     47     s=(char*)malloc(sizeof(char)*(max+1));
     48     s[0]='0';
     49     //相加,不考虑进位
     50     for (i=min-1,j=max-1,k=max;i>=0;i--,j--,k--)
     51         s[k]=pmin[i]-'0'+pmax[j];
     52     //长串的多余的加上去
     53     for (;j>=0;j--,k--)
     54         s[k]=pmax[j];
     55     for (i=max;i>=0;i--)
     56         if (s[i]>'9')
     57         {
     58             s[i]-=10;
     59             s[i-1]++;
     60         }
     61         if (s[0]=='0')
     62         {
     63             for (i=0;i<=max;i++)
     64                 c[i-1]=s[i];
     65             c[i-1]='';
     66         }
     67         else
     68         {
     69             for (i=0;i<=max;i++)
     70                 c[i]=s[i];
     71             c[i]='';
     72         }
     73         free(s);
     74   
     75 }
     76 void addZero(char *a,int n)
     77 {
     78      int len = strlen(a);
     79      int i;
     80      for(i=0; i<n; i++)
     81      {
     82           a[len+i] = '0';
     83      }
     84      a[len+i] = '';
     85 }
     86 void removeLast(char* a)
     87 {
     88      int len = strlen(a);
     89      for(int i=len-1; i>=0; i--)
     90      {
     91           if(a[i]=='0')
     92                a[i] = '';
     93           else
     94                break;
     95      } 
     96 }
     97 void addPoint(char* a,int n)
     98 {
     99      int i,j;
    100      for(i=strlen(a),j=0; j<=n; i--,j++)
    101      {
    102           a[i+1] = a[i];
    103      }
    104      a[i+1] = '.';
    105 }
    106 int main()
    107 {
    108 //     freopen("1137.in","r",stdin);
    109  //    freopen("1137.out","w",stdout);
    110       
    111      scanf("%d",&n);
    112      int apos,bpos;
    113      while(n--)
    114      {
    115           scanf("%s %s",a,b);
    116           apos = remove(a,'.');
    117           bpos = remove(b,'.');
    118           if(apos>bpos)
    119           {
    120                addZero(b,apos-bpos);
    121                add(a,b,c);
    122                addPoint(c,apos);
    123                removeLast(c);
    124                printf("%s
    ",c);
    125           }else if(apos<bpos)
    126           {
    127                addZero(a,bpos-apos);
    128                add(a,b,c);
    129                addPoint(c,bpos);
    130                removeLast(c);
    131                printf("%s
    ",c);
    132           }else
    133           {
    134                add(a,b,c);
    135                addPoint(c,apos);
    136                removeLast(c);
    137                printf("%s
    ",c);
    138           }
    139                      
    140      }
    141       
    142      return 0;    
    143 }
    View Code
  • 相关阅读:
    PowerDesigner 取消 Name 和 Code 的同步
    租赁内含利率、增量借款利率
    投资收益月末结转
    产品保修费计入哪里
    投资收益
    投资性房地产成本模式转为公允价值模式
    公允价值变动计入所得税费用还是其他综合收益
    所得税费用
    什么是预算会计
    产品质量保证费纳入应纳税所得额吗
  • 原文地址:https://www.cnblogs.com/codershell/p/3330256.html
Copyright © 2020-2023  润新知