九度OJ-1137:浮点数加法

  本题本来想采用写好的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
来源:
2008年北京大学软件所计算机研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问: 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值