九度OJ-1137:浮点数加法

来源:互联网 发布:怎么用手机看网络延迟 编辑:程序博客网 时间:2024/05/20 10:52

  本题本来想采用写好的BigInt模板直接套用,后来发现用高精度整数相当麻烦,于是直接使用字符串加法器的方法进行重写。

Debug过程:

  见代码注释。

题目描述:

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

输入:

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

输出:

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

样例输入:
20.1111111111111111111111111111110.11111111111111111111111111111110000000.6555555555555555555555555555551.444444444444444444444444444445
样例输出:
0.22222222222222222222222222222210000002.1
来源:
2008年北京大学软件所计算机研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7860-1-1.html


#include <iostream>#include <cstring>#define MAXSIZE 1000using namespace std;int main(){int n;char s[110],t[110],u[110];int scount,tcount; int temp,c;while (cin>>n){while (n--){//initiatec=0;cin>>s>>t;//countint i,j; for (i=0;s[i]!='.';i++);i++;for (scount=0;s[i]!='\0';i++,scount++);for (i=0;t[i]!='.';i++);i++;for (tcount=0;t[i]!='\0';i++,tcount++);//adjustint slen=strlen(s);int tlen=strlen(t);for (i=slen;i<tcount-scount+slen;i++)s[i]='0';s[i]='\0';for (i=tlen;i<scount-tcount+tlen;i++)t[i]='0';t[i]='\0';if (strlen(s)<strlen(t)){strcpy(u,s);strcpy(s,t);strcpy(t,u);}//strlen(s)>=strlen(t)//calfor (i=strlen(s)-1,j=strlen(t)-1;j>=0;i--,j--){if (s[i]=='.')continue;temp=(s[i]-'0')+(t[j]-'0')+c;//****bug:t[j]而非t[i] c=temp/10;s[i]=temp%10+'0';}while (j<0&&i>=0&&c!=0){//***bug:忘记考虑到整数部分长-整数部分短型的短数最后一位存在进位的情况,需要这个while来处理 temp=s[i]-'0'+c;c=temp/10;s[i]=temp%10+'0';i--;}//cut '0' at the endfor (int i=strlen(s)-1;s[i]=='0';i--)s[i]='\0';//outputif (c!=0)//if 是整数部分同长型,最后一位存在的进位会遗留在c里,要把它输出来 cout<<c;cout<<s<<endl;}}return true;}


0 0
原创粉丝点击