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;
}