[九度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 }
作者:庸男勿扰
出处:http://www.cnblogs.com/codershell
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果您觉得对您有帮助,不要忘了推荐一下哦~
出处:http://www.cnblogs.com/codershell
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果您觉得对您有帮助,不要忘了推荐一下哦~