浮点数加法

来源:互联网 发布:ubuntu引导没有win10 编辑:程序博客网 时间:2024/05/16 09:38

问题 C: 浮点数加法

时间限制: 1 Sec  内存限制: 32 MB

题目描述

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

输入

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

输出

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

样例输入

23.75690.5644543.543543.25

样例输出

94.324586.7935
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;struct bign{int d[1005];int len;bign(){memset(d,0,sizeof(d));len=0;}};bign change(char str[],int num){bign a;int i,flag=0;a.len=strlen(str)-1;for(i=0;i<num;i++)a.d[i]=0;for(int j=0;j<=a.len;j++,i++){if(str[a.len-j]!='.')a.d[i-flag]=str[a.len-j]-'0';   //逆序存储 elseflag=1;}a.len+=num;return a;}bign add(bign a,bign b){bign c;int carry=0;for(int i=0;i<a.len||i<b.len;i++){int tmp=a.d[i]+b.d[i]+carry;c.d[c.len++]=tmp%10;carry=tmp/10; }if(carry)c.d[c.len++]=carry;return c;}void print(bign a,int dot){int lower_bound;for(lower_bound=0;a.d[lower_bound]==0;lower_bound++);for(int i=a.len-1;i>=lower_bound;i--){printf("%d",a.d[i]);if(i==dot)putchar('.');}putchar('\n');}int main(){int n; scanf("%d",&n);while(n--){int i,len1,len2,dot1,dot2,dot;char str1[150]={0},str2[150]={0};bign a,b;getchar();gets(str1);gets(str2);len1=strlen(str1);len2=strlen(str2);for(i=len1-1;str1[i]!='.';i--);dot1=len1-i;for(i=len2-1;str2[i]!='.';i--);dot2=len2-i;if(dot1>=dot2){a=change(str1,0);b=change(str2,dot1-dot2);}else{a=change(str1,dot2-dot1);b=change(str2,0);}dot=max(dot1,dot2)-1;print(add(a,b),dot);}return 0;}