cjweffort

博客园 首页 联系 订阅 管理

http://ac.jobdu.com/problem.php?cid=1040&pid=62

题目描述:

求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

// 题目63:浮点数加法.cpp: 主项目文件。

#include "stdafx.h"
#include <cstdio>
#include <cstring>

#define max(a,b) a>b?a:b
const int N=103;
int a_int[N],a_dec[N],b_int[N],b_dec[N];
char sum[N];

int pointIndex(char *str, int length)
{
	int pointPos=0;
	while(pointPos<length)
	{
		if(str[pointPos]=='.')
			break;
		pointPos++;
	}
	return pointPos;
}

int initCopy(char *str, int length,int *aint, int *adec)
{
	int pointPos=pointIndex(str,length);
	int l=pointPos,r=length-pointPos-1;
	//memset(aint,0,sizeof(aint));
	//memset(adec,0,sizeof(adec));
	for(int i=pointPos-1,j=0;i>=0;i--,j++)
		aint[j]=str[i]-'0';
	for(int i=pointPos+1,j=0;i<length;i++,j++)
		adec[j]=str[i]-'0';
	return pointPos;
}

void plus(char *str1, int length1, char *str2, int length2)
{
	memset(a_int,0,sizeof(a_int));
	memset(a_dec,0,sizeof(a_dec));
	memset(b_int,0,sizeof(b_int));
	memset(b_dec,0,sizeof(b_dec));
	int pointPos1=initCopy(str1,length1,a_int,a_dec);
	int pointPos2=initCopy(str2,length2,b_int,b_dec);
	int max1=max(pointPos1,pointPos2),max2=max(length1-pointPos1-1,length2-pointPos2-1);
	memset(sum,0,sizeof(sum));
	bool flag=true;
	int cur=N-1,end=-1,in=0;
	for(int i=max2-1;i>=0;i--)
	{
		int temp=in+a_dec[i]+b_dec[i];
		sum[cur--]=temp%10+'0';
		in=temp/10;
		if(flag)
		{
			if(sum[cur+1]!='0')
			{
				flag=false;
				end=cur+1;
			}
		}
	}
	sum[cur--]='.';
	for(int i=0;i<max1;i++)
	{
		int temp=in+a_int[i]+b_int[i];
		sum[cur--]=temp%10+'0';
		in=temp/10;
	}
	if(in!=0)
		sum[cur--]=in+'0';
	for(int i=cur+1;i<=end;i++)
		putchar(sum[i]);
	printf("\n");
}

int main()
{
    int testCase;
	scanf("%d",&testCase);
	while(testCase--)
	{
		char str1[N],str2[N];
		scanf("%s%s",str1,str2);
		int length1=strlen(str1),length2=strlen(str2);
		plus(str1,length1,str2,length2);
	}
    return 0;
}


posted on 2013-03-10 00:23  cjweffort  阅读(324)  评论(0编辑  收藏  举报