本题本来想采用写好的BigInt模板直接套用,后来发现用高精度整数相当麻烦,于是直接使用字符串加法器的方法进行重写。
Debug过程:
见代码注释。
-
题目描述:
-
求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
-
答疑:
- 解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7860-1-1.html
#include <iostream>
#include <cstring>
#define MAXSIZE 1000
using namespace std;
int main(){
int n;
char s[110],t[110],u[110];
int scount,tcount;
int temp,c;
while (cin>>n){
while (n--){
//initiate
c=0;
cin>>s>>t;
//count
int 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++);
//adjust
int 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)
//cal
for (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 end
for (int i=strlen(s)-1;s[i]=='0';i--)
s[i]='\0';
//output
if (c!=0)//if 是整数部分同长型,最后一位存在的进位会遗留在c里,要把它输出来
cout<<c;
cout<<s<<endl;
}
}
return true;
}