当前位置: 代码迷 >> 综合 >> 题目1137:浮点数加法 九度OJ
  详细解决方案

题目1137:浮点数加法 九度OJ

热度:61   发布时间:2023-09-24 06:29:06.0
题目1137:浮点数加法

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:3916

解决:1048

题目描述:

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

输入:

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

输出:

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

样例输入:
2
0.111111111111111111111111111111
0.11111111111111111111111111111110000000.655555555555555555555555555555
1.444444444444444444444444444445
样例输出:
0.222222222222222222222222222222
10000002.1
来源:
2008年北京大学软件所计算机研究生机试真题

#include <cstdio>
#include <iostream>
#include <cstring>
#define MAX 105 
using namespace std;
int ax[MAX],az[MAX],bx[MAX],bz[MAX];string a,b;
int main(){int n;while(scanf("%d",&n)!=EOF){for(int kase=0;kase<n;kase++){memset(ax,0,sizeof(ax));memset(az,0,sizeof(az));memset(bx,0,sizeof(bx));memset(bz,0,sizeof(bz));cin>>a;cin>>b;if(kase!=n-1)getchar();size_t pos1=a.find('.');size_t pos2=b.find('.');int azsize=0;for(int i=pos1-1;i>=0;i--){az[azsize++]=a[i]-'0';}int bzsize=0;for(int i=pos2-1;i>=0;i--){bz[bzsize++]=b[i]-'0';}int axsize=0;for(int i=pos1+1;i<a.size();i++){ax[axsize++]=a[i]-'0';}int bxsize=0;for(int i=pos2+1;i<b.size();i++){bx[bxsize++]=b[i]-'0';}//计算小数位int xpos,zpos,carry=0;if(axsize>=bxsize){xpos=axsize;} else{xpos=bxsize;}for(int i=xpos-1;i>=0;i--){int temp=ax[i]+bx[i]+carry;ax[i]=temp%10;carry=temp/10;}//检测小数有效位  逆序遍历int flag=0,real_xpos=xpos;for(int i=xpos-1;i>=0;i--){if(ax[i]==0){real_xpos--;}else{break;}} if(azsize>=bzsize){zpos=azsize;}else{zpos=bzsize;}for(int i=0;i<zpos;i++){int temp=az[i]+bz[i]+carry;az[i]=temp%10;carry=temp/10;}if(carry!=0){az[zpos++]=carry;}for(int i=zpos-1;i>=0;i--){cout<<az[i];}cout<<".";for(int i=0;i<real_xpos;i++){cout<<ax[i];}cout<<endl;}}return 0;
} 

代码效率太低。不过好歹也过了。该去做瑜伽了。(逃