题目1137:浮点数加法 九度OJ

浮点数加法实现
本文介绍了一种解决浮点数加法问题的方法,通过分解浮点数为整数部分和小数部分,并分别进行处理来确保计算精度。文章提供了一个具体的C++实现示例。
题目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;
} 

代码效率太低。不过好歹也过了。该去做瑜伽了。(逃
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值