当前位置: 代码迷 >> 综合 >> 问题 C: 浮点数加法
  详细解决方案

问题 C: 浮点数加法

热度:109   发布时间:2023-09-22 10:19:29.0

题目描述

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

输入

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

输出

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

样例输入

2
3.756
90.5644543.5435
43.25

样例输出

94.32
4586.7935

 

 

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
struct floatn{int z[300],x[300];int z_len,x_len;floatn(){memset(z,0,sizeof(z));z_len=0;memset(x,0,sizeof(x));x_len=0;}
};
floatn add(floatn a,floatn b)
{floatn c;int carry=0;int i,j;//printf("add:a.x_len=%d b.x_len=%d\n",a.x_len,b.x_len);//printf("add:a.z_len=%d b.z_len=%d\n",a.z_len,b.z_len);if(a.x_len>b.x_len){j=b.x_len-1; for(i=a.x_len-1;i>a.x_len-1-b.x_len;i--){b.x[i]=b.x[j--];}while(i>=0)b.x[i--]=0;b.x_len=a.x_len;}else if(a.x_len<b.x_len){j=a.x_len-1; for(i=b.x_len-1;i>b.x_len-1-a.x_len;i--){a.x[i]=a.x[j--];}while(i>=0)a.x[i--]=0;a.x_len=b.x_len;}/*printf("\n");printf("add:a.x_len=%d b.x_len=%d\n",a.x_len,b.x_len);printf("add:a.z_len=%d b.z_len=%d\n",a.z_len,b.z_len);printf("add: a=\n");for(i=a.z_len-1;i>=0;i--)printf("%d",a.z[i]);printf(".");for(i=a.x_len-1;i>=0;i--)printf("%d",a.x[i]);printf("\n");printf("\nadd: b=\n");for(i=b.z_len-1;i>=0;i--)printf("%d",b.z[i]);printf(".");for(i=b.x_len-1;i>=0;i--)printf("%d",b.x[i]);printf("\n---add--\n");*/	for(i=0;i<a.x_len||i<b.x_len;i++){int temp=carry+a.x[i]+b.x[i];c.x[c.x_len++]=temp%10;carry=temp/10;}for(i=0;i<a.z_len||i<b.z_len;i++){int temp=carry+a.z[i]+b.z[i];c.z[c.z_len++]=temp%10;carry=temp/10;}if(carry!=0){c.z[c.z_len++]=carry;}return c;
}
floatn change(char str[]){floatn a;int i;int z_len=0;int str_len=strlen(str);for(i=0;i<str_len;i++){if(str[i]=='.')break;}z_len=i;//x_len=str_len-i-1;for(i=z_len-1;i>=0;i--){a.z[a.z_len++]=str[i]-'0';}for(i=str_len-1;i>z_len;i--){a.x[a.x_len++]=str[i]-'0';}return a;
}
void print(floatn c)
{int i,zeron=0;for(i=c.z_len-1;i>=0;i--){printf("%d",c.z[i]);}for(i=0;i<=c.x_len-1;i++){if(c.x[i]==0)zeron++;else break;}if(c.x_len!=zeron){printf("."); for(i=c.x_len-1;i>=zeron;i--){printf("%d",c.x[i]);}	 	}printf("\n");
}
int main()
{int n,i;floatn a,b,c;char str_a[105],str_b[105];while(scanf("%d",&n)!=EOF&&n!=0){while(n--){scanf("%s",str_a);a=change(str_a);scanf("%s",str_b);b=change(str_b);c=add(a,b);print(c);}}/*while(scanf("%s%s",str_a,str_b)!=EOF){a=change(str_a);b=change(str_b);c=add(a,b);print(c);}*/return 0;
}

 

  相关解决方案