版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/xunalove/article/details/88250033
题目描述
求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj
对于整数部分,P1P2...Pi是一个非负整数
对于小数部分,Qj不等于0
输入
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符
输出
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
样例输入
2 3.756 90.564 4543.5435 43.25
样例输出
94.32 4586.7935
易错
- 输入0.0 + 0.0 = 0.0
- 字符数组增加或者减少后要加'\0'作为结束标志。(切记切记切记)
#include<stdio.h> #include<math.h> #include<algorithm> #include<string.h>//memset的头文件 using namespace std; struct bign { int d[101];//数组要开的足够大,切记切记,这里错误了一次 int len ;//总长度 bign() { memset(d,0, sizeof(d)); len = 0; } }; int Find(char s[])//返回小数点的位数 { for(int i=0; i<strlen(s); i++) { if(s[i]=='.') return strlen(s)-i-1; } } bign change(char s[])//将字符串转换为整型 { bign a; for(int i=strlen(s)-1; i>=0; i--) { if(s[i]!='.') a.d[a.len++] = s[i]-'0'; } return a; } bign add(bign a, bign b) { bign c; int carry = 0, temp; for(int i=0; i<a.len||i<b.len; i++) { temp = a.d[i] + b.d[i] + carry; c.d[c.len++] = temp % 10; carry = temp /= 10; } if(carry!=0) c.d[c.len++]= carry; return c; } int main() { int n; scanf("%d",&n); getchar(); while(n--) { char s1[101], s2[102]; scanf("%s %s", s1, s2); int len1 = Find(s1),len2 = Find(s2), t=0, pindex; pindex = max(len1, len2); if(len1<len2) //len2++ { t = strlen(s1); for(int i=0; i<len2-len1; i++) s1[t++] = '0'; s1[t] = '\0'; } else //len1 >= len2 { t = strlen(s2); for(int i=0; i<len1-len2; i++) s2[t++] = '0'; s2[t] = '\0';//切记切记切记,字符数组要加'\0' } bign a, b; a = change(s1); b = change(s2); bign ans = add(a, b); for(int i=ans.len-1; i>=pindex; i--)//输出整数部分 printf("%d",ans.d[i]); printf("."); //小数部分0~pindex-1 int i; for(i=0; i<pindex; i++) { if(ans.d[i]!=0) break; } for(int j=pindex-1; j>=i;j--) printf("%d",ans.d[j]); if(i==pindex) printf("0"); printf("\n"); getchar();//接受空行 } return 0; } /* */