作者: 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;
}```