hdoj-1753-大明A+B(大数)

1 篇文章 0 订阅

大明A+B

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10109    Accepted Submission(s): 3630


Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
 

Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
 

Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
 

Sample Input
  
  
1.1 2.9 1.1111111111 2.3444323343 1 1.1
 

Sample Output
  
  
4 3.4555434454 2.1
 解题思路:
         这是用大数来解决小数加减。
         将给定的数据分为整数和小数部分,整数逆着存到一个数组(从0开始),小数正着存到一个数组(从1开始)。
         先进行小数运算,逆着运算;然后将小数[0]加到整数[0],然后整数运算,正着运算。
         然后清除整数数组后面多余的0,逆着输出,清除小数后面的0,并判断是否到0,否则输出小数点,且小数数组正着输出。
代码:
#include<stdio.h>
#include<string.h>
char a[410],b[410];
int za[410],zb[410];
int xa[410],xb[410];
int ze[410],xe[410];
int main()
{
	int lena,lenb;
	int poa,pob;
	int now;
	int i,j,k;
	int lxa,lxb;
	while(scanf("%s%s",a,b)!=EOF)
	{
		lena=strlen(a);
		lenb=strlen(b);
		for(i=0;i<lena&&a[i]!='.';i++)
		{
		}
		poa=i;
		for(i=0;i<lenb&&b[i]!='.';i++)
		{
		}
		pob=i;
		//找小数点 
		memset(za,0,sizeof(za));
		memset(zb,0,sizeof(zb));
		memset(xa,0,sizeof(xa));
		memset(xb,0,sizeof(xb));
		//清空临时存储数组 
		for(i=poa-1,j=0;i>=0;i--,j++)
		    za[j]=a[i]-'0';
		for(i=pob-1,j=0;i>=0;i--,j++)
		    zb[j]=b[i]-'0';
		//整数逆着存储    
		for(i=poa+1,j=1;i<lena;i++,j++)
		    xa[j]=a[i]-'0';
		lxa=j-1;
		for(i=pob+1,j=1;i<lenb;i++,j++)
		    xb[j]=b[i]-'0';//注意j从1开始 
		lxb=j-1;
		//小数正着存储 
		if(lxa<lxb)
		{
			lxa=lxb;
		}//找长的 
		memset(xe,0,sizeof(xe));
		for(i=lxa;i>=0;i--)
		{
			xe[i]+=xa[i]+xb[i];
			if(xe[i]>9)
			{
				xe[i-1]+=xe[i]/10;
				xe[i]%=10;
			}
		}
		//小数逆着运算 
		if(poa<pob)
		{
			poa=pob;
		}
		memset(ze,0,sizeof(ze));
		if(xe[0]!=0)
		    ze[0]+=xe[0];//小数[0]加到整数[0] 
		for(i=0;i<=poa;i++)
		{
			ze[i]+=za[i]+zb[i];
			if(ze[i]>9)
			{
				ze[i+1]+=ze[i]/10;
				ze[i]%=10;
			}
		}
		//整数正着运算 
		for(i=poa;i>=0&&ze[i]==0;i--)
		{
		}
		for(;i>=0;i--)
		    printf("%d",ze[i]);
		
		for(i=lxa;i>0;i--)
		    if(xe[i]!=0)
		        break;
		if(i!=0)
		{
			j=i;
			printf(".");
			for(j=1;j<=i;j++)
			    printf("%d",xe[j]);
		}
		printf("\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值