加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 02:26:45 所属栏目:大数据 来源:网络整理
导读:大明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 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫

大明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.2222222222 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,sizeof(za));
		memset(zb,sizeof(zb));
		memset(xa,sizeof(xa));
		memset(xb,sizeof(xb));
		//清空临时存储数组 
		for(i=poa-1,j=0;i>=0;i--,j++)
		    za[j]=a[i]-'0';
		for(i=pob-1,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,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,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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读