此题思路简单,就是格式非常繁琐,对齐的方式值得考量,我在此分享的技巧。
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);
}
}