题目1137:浮点数加法
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:3916
解决:1048
-
题目描述:
-
求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj
对于整数部分,P1P2...Pi是一个非负整数
对于小数部分,Qj不等于0
-
输入:
-
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符
-
输出:
-
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
-
样例输入:
-
2 0.111111111111111111111111111111 0.111111111111111111111111111111 10000000.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; }
代码效率太低。不过好歹也过了。该去做瑜伽了。(逃