东华复试OJ-49 实数相加

作者: Turbo时间限制: 1S章节: 基本练习(字符串)

问题描述 :

计算两个实数相加的结果。
  输入的实数满足如下要求: (1)  小数点前的整数部分最多100位,(2) 小数点后的小数部分最多100位.

输入说明 :

两行字符串,每行都是一个合法的实数。合法的意思是指:  整数部分的值如果大于零,则最高位数字必定大于零. 如果整数部分的值为零,则整数部分只有一个零. 小数部分尾部可以有任意多的零. 可以没有小数部分,  此时也没有小数点. 如果有小数点, 则至少需要有一位小数部分, 且允许是零.

输出说明 :

相加结果。注意: 小数部分末尾如果有连续的0, 则它们都是有效数字,  不能舍去. 如果是两个整数相加, 则结果仍为整数而没有小数部分.

输入范例 :

999999999991.001
8.99999999999999999999999

输出范例 :

1000000000000.00099999999999999999999

代码及思路这位大佬写得都很详细
虽然,看懂之后觉得不是很难,但是自己敲的时候还是有很多小细节的地方没注意到,出现了bug。

代码:

#include
#include
int main()
{
	char a[203],b[203];
	int c[101]={0},d[101]={0};
	int az=0,bz=0,ax=0,bx=0,ap=0,bp=0,lena,lenb,i;
	gets(a);
	gets(b);
	lena=strlen(a);
	lenb=strlen(b);
	for(i=0;i<lena;i++)
	{
		if(a[i]=='.')
			ax=1;
		if(ax==0)
			az++;
		if(ax==1&&a[i]!='.')
			ap++;
	}
	for(i=0;i<lenb;i++)
	{
		if(b[i]=='.')
			bx=1;
		if(bx==0)
			bz++;
		if(bx==1&&b[i]!='.')
			bp++;
	}
	for(i=0;i<az||i<bz;i++)
	{
		if(i<az)
		{
			c[i]+=a[az-i-1]-'0';
		}
		if(i<bz)
		{
			c[i]+=b[bz-i-1]-'0';
		}
		if(c[i]>9)
		{
			c[i+1]++;
			c[i]%=10;
		}
	}
	if(ax==1||bx==1)
	{
		for(i=0;i<ap||i<bp;i++)
		{
			if(i<ap)
			{
				d[i]+=a[az+i+1]-'0';
			}
			if(i<bp)
			{
				d[i]+=b[bz+i+1]-'0';
			}
		}
		if(az<bz)
			az=bz;
		if(ap<bp)
			ap=bp;
		for(i=ap-1;i>0;i--)
		{
			if(d[i]>9)
			{
				d[i-1]++;
				d[i]%=10;
			}
		}
		if(d[0]>9)
		{
			c[0]++;
			d[0]%=10;
			int j=0;
			while(c[j]>9)
			{
				c[j+1]++;
				c[j]%=10;
			}
		}
		if(c[az]>0)
			printf("%d",c[az]);
		for(i=az-1;i>=0;i--)
		{
			printf("%d",c[i]);
		}
		printf(".");
		for(i=0;i<ap;i++)
		{
			printf("%d",d[i]);
		}
	}
	else
	{
		if(az<bz)
			az=bz;
		if(c[az]>0)
			printf("%d",c[az]);
		for(i=az-1;i>=0;i--)
			printf("%d",c[i]);
	}
	printf("\n");
	return 0;
}```

你可能感兴趣的:(东华复试)