代码改变世界

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

2013-09-20 11:02  庸男勿扰  阅读(514)  评论(0编辑  收藏  举报

原题链接: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!='\0'; p++,i--){
 15          if(*p==c){
 16               pos = i;
 17               char* q;
 18               for(q=p;*q!='\0'; 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]='\0';
 66         }
 67         else
 68         {
 69             for (i=0;i<=max;i++)
 70                 c[i]=s[i];
 71             c[i]='\0';
 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] = '\0';
 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] = '\0';
 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\n",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\n",c);
132           }else
133           {
134                add(a,b,c);
135                addPoint(c,apos);
136                removeLast(c);
137                printf("%s\n",c);
138           }
139                      
140      }
141       
142      return 0;    
143 }
View Code