题目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; }
代码效率太低。不过好歹也过了。该去做瑜伽了。(逃