BIT小学期,7 A+B(2)

此题思路简单,就是格式非常繁琐,对齐的方式值得考量,我在此分享的技巧。

1,建立a,b,ans字符串储存加数和答案。

2,再scanf(“%s)a和b之后,先判断他们时整数还是小数,记录小数点位置。

3,若a和b中不全是小数,那么在整数的字符串最后加上小数点,将整数也看作小数,方便之后的对齐。

4,现在a和b全是小数,根据小数点对齐a和b,

举例:若a的小数点位置为p1,b的小数点位置为p2,p1>p2。就将b字符串向后挪动p1-p2距离,并在b前补上空格。

5,从后往前按位计算,得到进位和本位,记录ans[i]为上一次进位加本位。此处注意char向int转换后计算,其中char若为‘\0’火=或空格也要转换为0参与计算。

6.得到的答案要去除前导0,转换为空格,注意a,b,ans若为整数的话要去除小数点。

7.已经对齐了的两个加数和答案就非常容易输出了.

#include<stdio.h>
#include<string.h>
char a[4005]={'\0'},b[4005]={'\0'};
char ans[4005]={'\0'};
int num(char c)
{
	if(c=='\0'||c==' ')
	{
		return 0;
	}
	else
	{
		int r=c-'0';
		return r;
	}
}
int main()
{
	int i,j,p1=0,p2=0,flag=0;
	int f1=0,f2=0;
	scanf("%s",a);
	scanf("%s",b);
	for(i=0;i<1000;i++)//f1,f2=0就为整数,p1,p2为小数点的位置
	{
		if(a[i]=='.')
		{
			p1=i;
			f1=1;
		}
		if(b[i]=='.')
		{
			p2=i;
			f2=1;
		}
	}
	if(f1==0)//若是整数也看成小数,加一个‘.’,方便对齐
	{
		for(i=0;a[i]!='\0';i++)
		{
		}
		a[i]='.';
		p1=i;
	}
	if(f2==0)
	{
		for(i=0;b[i]!='\0';i++)
		{
		}
		b[i]='.';
		p2=i;
	}
	if(p1>p2)//根据小数点对齐数据
	{
		int cha=p1-p2;
		for(i=1001;i>=0;i--)
		{
			b[i+cha]=b[i];
		}
		for(i=0;i<cha;i++)
		{
			b[i]=' ';
		}
		p2=p1;
	}
	else if(p1<p2)
	{
		int cha=p2-p1;
		for(i=1001;i>=0;i--)
		{
			a[i+cha]=a[i];
		}
		for(i=0;i<cha;i++)
		{
			a[i]=' ';
		}
		p1=p2;
	}
	for(i=3998;i>=0;i--)//为前面空出一个格子,可以存放ans的最大进位
    {
        a[i+1]=a[i];
        b[i+1]=b[i];
    }
    a[0]=' ';b[0]=' ';
	int in=0,temp;
	for(i=3999;i>=0;i--)//计算
	{
		if(a[i]=='.')
		{
			ans[i]='.';
			continue;
		}
		else if(a[i]!='\0'||b[i]!='\0')
		{
			temp=num(a[i])+num(b[i])+in;
			ans[i]=temp%10+'0';
			in=temp/10;
		}
	}
	if(ans[0]=='0')
	{
		ans[0]=' ';
		flag=1;
	}
	if(f1==0)//若为整数去掉小数点
	a[p1+1]='\0';
	if(f2==0)
	b[p1+1]='\0';
	for(i=0;i<=p1+1;i++)//可以利用ans的小数点去掉ans的前导0
	{
		if((ans[i]>='1'&&ans[i]<='9')||(ans[i+1]=='.'))
		{
			break;
		}
		if(ans[i]=='0'&&ans[i+1]!='.')
		{
			ans[i]=' ';
		}
	}
	if(f1==0&&f2==0)//再去掉‘.’
	ans[p1+1]='\0';
	int len;//接下来分为有ans最大进位或者无ans最大进位的输出
	if(flag==1)
	{//ans无最大进位
		len=strlen(ans)+2;
		printf("  %s",a);
		for(i=1;i<=len-strlen(a)-2;i++)
		printf(" ");
		printf("\n");
		printf("+ %s",b);
		for(i=1;i<=len-strlen(b)-2;i++)
		printf(" ");
		printf("\n");
		for(int k=1;k<=len;k++)
		{
			printf("-");
		}
		printf("\n");
		printf("  %s\n",ans);
	}
	else if(flag==0)
	{//ans有最大进位
		len=strlen(ans)+3;
		printf("   %s",a);
		for(i=1;i<=len-strlen(a)-3;i++)
		printf(" ");
		printf("\n");
		printf("+  %s",b);
		for(i=1;i<=len-strlen(b)-3;i++)
		printf(" ");
		printf("\n");
		for(int k=1;k<=len;k++)
		{
			printf("-");
		}
		printf("\n");
		printf("   %s\n",ans);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值