HDU-1753 实数高精度加法

本文详细介绍了如何在C++环境下将字符串形式的浮点数解析为双精度浮点数,并实现浮点数的加法运算。通过自定义函数conv进行字符串到浮点数的转换,利用disp函数展示转换结果,最后通过add函数完成浮点数加法操作。
/*
 * hdu-1753 daming a+b
 * mike-w
 * 2012-5-23
 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_SIZE 456

typedef struct long_double
{
	int ww[MAX_SIZE];
	int ff[MAX_SIZE];
}ld;

int conv(char *s, ld *t)
{
	int dot=-1,i;
	for(i=0;s[i];i++)
		if(s[i]=='.')
			break;
	dot=i;
	for(i=1;dot-i>=0;i++)
		t->ww[MAX_SIZE-i]=s[dot-i]-'0';
	if(dot>=0 && s[dot]=='.')
		for(i=0;s[i+dot+1];i++)
			t->ff[i]=s[i+dot+1]-'0';
	return 0;
}

int disp(ld *s)
{
	int i,end;
	/* whole part */
	for(i=0;i<MAX_SIZE && s->ww[i]==0;i++)
		;
	if(i==MAX_SIZE)
		printf("0");
	else
	{
		for(;i<MAX_SIZE;i++)
			printf("%d",s->ww[i]);
	}
	/* small part */
	for(i=MAX_SIZE-1;i>=0 && s->ff[i]==0;i--)
		;
	if(i>=0) /* has small part */
	{
		putchar('.');
		end=i;
		for(i=0;i<=end;i++)
			printf("%d",s->ff[i]);
	}
	putchar('\n');
	return 0;
}

int add(ld *a, ld *b, ld *c)
{
	int carry=0,i;
	for(i=MAX_SIZE-1;i>=0;i--)
	{
		c->ff[i]+=a->ff[i]+b->ff[i]+carry;
		carry=c->ff[i]/10;
		c->ff[i]%=10;
	}
	for(i=MAX_SIZE-1;i>=0;i--)
	{
		c->ww[i]+=a->ww[i]+b->ww[i]+carry;
		carry=c->ww[i]/10;
		c->ww[i]%=10;
	}
	return 0;
}

int main(void)
{
#ifndef ONLINE_JUDGE
	freopen("daming.in","r",stdin);
#endif
	char buf[MAX_SIZE];
	ld a,b,c;
	while(scanf("%s",buf)!=EOF)
	{
		memset(&a,0,sizeof(a));
		memset(&b,0,sizeof(b));
		memset(&c,0,sizeof(c));
		conv(buf,&a);
		scanf("%s",buf);
		conv(buf,&b);
		add(&a,&b,&c);
		disp(&c);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值