7.A+B(Ⅱ)

Description

龙龙觉得之前的二进制加法可能对你来说太简单了,正好你也学完了“字符串处理”专题,那么就来考验一下你对大数加法的熟练程度吧?下面举一个实数加法运算的实例:

   2.01
+  1.0 
-------
   3.01

请你模拟这个过程。

Input

第一行输入一个实数a,表示加数,第二行输入一个实数b表示被加数,两者非负,可能会有前导零和后导零出现。

Output

请模拟实数加法,按题目描述的格式输出。注意换行,程序输出中没有多余的空格和换行。

Hint

思路

思路:倒叙存储,对齐小数点位,相加,判断输出位数,倒序输出

注意:1、考虑小数+小数、小数+整数、整数+整数情况

           2、考虑逢十进一,但是下一位是小数点的情况

           3、注意分辨int与char的区别,如\000,0等

小结:一定要有耐心,写一部分测一部分,多用调试。

代码

#include <stdio.h>
#include  <math.h>
#include <string.h>
char arr1[2009]={0}; char arr2[2009]={0};  char arr3[2009]={0};

int main()
{
	char ch;int quan1,dian1,quan2,dian2,quan3,dian3; 
    int i=0; int bian=0;int flag=0;
	arr1[0]=getchar();	
	for(i=1;arr1[i-1]!='\n';i++)//存1 
	{
		arr1[i]=getchar();
		if(arr1[i]=='.') 
		{
			dian1=i+1;	flag=1;
		}
	}
	quan1=i-1;  
	if(flag==1) dian1=quan1-dian1+1;
	else dian1=0;
	arr1[quan1]='\000';	
	arr2[0]=getchar();flag=0;	
	for(i=1;arr2[i-1]!='\n';i++)//存2 
	{
		arr2[i]=getchar();
		if(arr2[i]=='.') 
		{
			dian2=i+1;	flag=1;
		}
	}
	quan2=i-1; 
	if(flag==1) dian2=quan2-dian2+1;
	else dian2=0;
	arr2[i-1]='\000';
	
	for( i=0;i<quan1/2;i++)//倒叙 
	{
		ch=arr1[i];
		arr1[i]=arr1[quan1-i-1];arr1[quan1-i-1]=ch;
	 } 
	 for( i=0;i<quan2/2;i++)//倒叙 
	{
		ch=arr2[i];
		arr2[i]=arr2[quan2-i-1];arr2[quan2-i-1]=ch;
	 } 
	
	if(dian1>dian2)//对齐小数点 
	{
		for(i=0;i<quan2;i++)
		{
			arr2[quan2-i+dian1-dian2-1] = arr2[quan2-1-i];
		}
		for(int j=0;j<dian1-dian2;j++)
		arr2[j]='0';
		quan2+=dian1-dian2;
		bian=2;
	}
	else if(dian2>dian1)
	{
		for(i=0;i<quan1;i++)
		{
			arr1[quan1-i+dian2-dian1-1] = arr1[quan1-1-i];
		}
		for(int j=0;j<dian2-dian1;j++)
		arr1[j]='0';
		quan1+=dian2-dian1;
		bian=1;
	}
	
	int j=(quan1>quan2?quan1:quan2);int m=0;//计算  
	for(i=0;i<j;i++)
	{
		int count=arr1[i]+arr2[i]-48+m;
		if(arr1[i]=='.'||count==46) 
		{
			arr3[i]='.'; continue;
		}
		if(count<=57) 
		{
			arr3[i]=(count>=48?count:count+48); m=0;
		}
		else if(count>57)
		{
			arr3[i]=count-10;
			if(i==j-1)
			arr3[i+1]='1';
			else m=1;
		}
	}
	
	for(i=j;i>0;i--)//结果有多少位呢 
	{
	  if(arr3[i]=='.')
	    {
			quan3=i+2; break;	
		}
	  if(arr3[i]!='0'&&arr3[i]!=0)
		{
			quan3=i+1; break;
		}
	 
	}
	
	int wei=(quan1>quan2?quan1:quan2);//输出多少位 
	(quan3>wei)?(wei=quan3):(wei=wei);
	wei+=3;
	j=0;
	
	for (i=0;i<wei;i++)//第一行 
	{
		if(bian!=1)
		{
			if(i<wei-quan1) printf(" ");
			else 
			{
				printf("%c",arr1[quan1-1-j]);j++;
			}
		}	
		else if(bian==1)
		{
			if(i<wei-quan1) printf(" ");
			else if(i>=wei-quan1&&j<quan1-dian2+dian1)
			{
				printf("%c",arr1[quan1-1-j]);j++;
			}
			else if(i>=wei-quan1-1&&j>=quan1-dian2+dian1)
			printf(" ");
		}	
	}printf("\n");

	j=0;
	for(i=0;i<wei;i++)//第二行 
	{
		if(i==0) 	
		{
			printf("+");continue;
		}
		if(bian!=2)
		{
			if(i<wei-quan2) printf(" ");
			else 
			{
				printf("%c",arr2[quan2-1-j]);j++;
			}
		} 
		else if(bian==2)
		{
			if(i<wei-quan2) printf(" ");
			else if(i>=wei-quan2&&j<quan2-dian1+dian2)
			{
				printf("%c",arr2[quan2-1-j]);j++;
			}
			else if(i>=wei-quan2-1&&j>=quan2-dian1+dian2)
			printf(" ");	
		}
	}printf("\n");
	
	for(i=0;i<wei;i++)//第三行 
	{
		printf("-");
	}printf("\n");
	
	j=0;
	for(i=0;i<wei;i++)//第四行 
	{	
		if(i<wei-quan3) printf(" ");
		else  
		{
			printf("%c",arr3[quan3-1-j]); j++;
		}
	}printf("\n");
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值