hdu1753大明A+B

75 篇文章 0 订阅
8 篇文章 0 订阅


hdu1753

包含小数点的字符串加法


测试输入:

0.0000001     0.1

1.0    2

100.89      1.13

0.0000000    1.1


输出

0.1000001

1.2

102.02

1.1


#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;

int main()
{
	int i,j,k,m,n,alen,blen;
	char t,x[210],y[210],a[210],b[210],c[210],d[210];
	while(scanf("%s%s",x,y)!=EOF)
	{
		memset(c,0,sizeof(c));
		memset(d,0,sizeof(d));
		for(i=0;i<strlen(x);i++)
		{
			if(x[i]=='.'){
				t=x[i];
				x[i]='\0';
				strcpy(a+1,x);
				strcpy(c+1,x+i+1);
				x[i]=t;
				break;
			}
			strcpy(a+1,x);
		}
		for(i=0;i<strlen(y);i++)
		{
			if(y[i]=='.'){
				t=y[i];
				y[i]='\0';
				strcpy(b+1,y);
				strcpy(d+1,y+i+1);
				y[i]=t;
				break;
			}
			strcpy(b+1,y);
		}
	//	printf("%s!\n%s!\n%s!\n%s!\n\n",a+1,c+1,b+1,d+1);
		
		//接下来计算 整数部分(a+b) 和小数部分(c+d)
		
		c+d
		
		c[0]='X';d[0]='X';//使用strlen()计算至'\0'为止.
		alen=strlen(c)-1;blen=strlen(d)-1;					//alen对应 c  blen对应d 
		m=min(alen,blen);n=max(alen,blen);
		
		for(i=1;i<=m;i++){
			y[i]=c[i]-'0'+d[i]-'0';
		}
		if(alen>blen)
		for(i=m+1;i<=n;i++)			y[i]=c[i]-'0';
		else	for(i=m+1;i<=n;i++)	y[i]=d[i]-'0';
		
		for(y[0]=0,i=n;i>0;i--){
			if(y[i]>9){
				y[i]-=10;
				y[i-1]++;
			}
		}
//		if(y[0])	printf("%d",y[0]);
//		for(i=1;i<=n;i++)	printf("%d",y[i]);printf("\n");
	//	system("pause");
		k=n;			//因为n在下面还会继续使用 ,此处先备份 留作输出用 
		///a+b
		
		a[0]='X';b[0]='X';//使用strlen()计算至'\0'为止。 
		alen=strlen(a)-1;blen=strlen(b)-1;
		m=min(alen,blen);n=max(alen,blen);
		x[0]='X';
		for(i=1;i<=n-m;i++)	x[i]='0';	x[i]='\0';
		if(alen>blen){
			strcat(x,b+1);
			for(i=1;i<=alen;i++)	x[i]=a[i]-'0'+x[i]-'0';
		}
		else{
			strcat(x,a+1);
			for(i=1;i<=blen;i++)	x[i]=b[i]-'0'+x[i]-'0';
		}
		
		x[n]+=y[0];			//衔接小数部分的结果 
		for(x[0]=0,i=n;i>0;i--)	
			if(x[i]>9){
				x[i]-=10;
				x[i-1]++;
			}
		
		if(x[0]!=0)	printf("%d",x[0]);
		for(i=1;i<=n;i++)	printf("%d",x[i]);
		
		for(i=k;i>0;i--){
		//	printf("~%c~\n",y[i]);
			if(y[i]!=0)	break;
			k=i-1;
		}
		
		if(i)	printf(".");
		for(i=1;i<=k;i++)	printf("%d",y[i]);
		
		printf("\n");
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值