代码如下:
#include <stdio.h>
#include <string.h>
//计算小数的位数
int xsws(char* buf)
{
int i=0;
int cnt = 0;
int flag = 0;
while(buf[i] != '\0')
{
if(buf[i]=='.')
flag = 1;
else
{
if(flag == 1)
cnt++;
}
i++;
}
return cnt;
}
int main()
{
char a[202]={0},b[202]={0};
char c[202]={0}; //保存计算结果
int i,j,t=0,shift = 0;
int xs1=0,xs2=0,zs1=0,zs2=0; //记录a和b小数和整数的位数
//读取a和b
gets(a);
gets(b);
//计算两个数整数部分和小数部分的位数
xs1 = xsws(a); zs1 = strlen(a) - xs1 -1;
xs2 = xsws(b); zs2 = strlen(b) - xs2 -1;
if (zs1 > zs2)
{
//将b后移zs1-zs2位
for(i=strlen(b)-1;i>=0;i--)
b[i+zs1-zs2] = b[i];
for(i=0;i<zs1-zs2;i++)
b[i]='0';
}else if(zs2 > zs1)
{
//将a后移zs2-zs1位
for(i=strlen(a)-1;i>=0;i--)
a[i+zs2-zs1] = a[i];
for(i=0;i<zs2-zs1;i++)
a[i]='0';
}
//将小数部分补0
if(xs1>xs2)
{
//将b最后补0
t = strlen(b);
for(i=0;i<xs1-xs2;i++)
b[i+t] = '0';
}else if(xs2>xs1)
{
//将a最后补0
t = strlen(a);
for(i=0;i<xs2-xs1;i++)
a[i+t]='0';
}
printf("%s\n",a);
printf("%s\n",b);
//此时a和b的长度一致
for (i=strlen(a)-1;i>=0;i--)
{
if(a[i]== '.')
{
c[i]='.';
continue;
}
t = (a[i]-'0') + (b[i]-'0')+shift;
shift = 0;
if(t>=10)
{
t-=10;
shift = 1;
}
c[i] = '0'+t;
}
if(shift)
printf("1%s",c); //如果进位是1,就先输出1,然后输出计算结果(进位不会超过1)
else
printf("%s",c);//如果进位是0,输出计算结果
return 0;
}