程序代码:
#include <stdio.h>
#include <string.h>
void foo()
{
char a[401] = { 0 }, b[401] = { 0 }; //字符形式,不用的位置统统是0
char sumint[810] = { 0 }, sumdec[810] = { 0 }; //每一位都是数值形式,不是字符。前者倒排
int pa=-1, pb=-1, len_a, len_b;
int i, td;
scanf("%s %s", a, b);
len_a = strlen(a);
len_b = strlen(b);
for (i = 0; i < 401; i++)
{ //找到小数点
if (a[i] == '.' || !a[i] && pa == -1)pa = i; //万一输入没有点
if (b[i] == '.' || !b[i] && pb == -1)pb = i;
if (pa >=0 && pb >= 0)break;
}
for (td = i = (len_a - pa > len_b - pb) ? len_a - pa : len_b - pb; i > 0; i--)
{ //小数部分从低到高按位求和,前面多出一位保存给整数部分的进位,td保存了用得到的最大下标
sumdec[i] += (a[pa + i] ? a[pa + i] - 48 : 0) + (b[pb + i] ? b[pb + i] - 48 : 0);
sumdec[i - 1] = sumdec[i] / 10;
sumdec[i] %= 10;
}
while (td > 0 && !sumdec[td])td--; //抹掉后缀0
sumint[0] = sumdec[0]; //进位
for (i = 1; pa - i >= 0 || pb - i >= 0; i++)
{ //整数部分从低到高按位求和
sumint[i - 1] += (pa - i >= 0 ? a[pa - i] - 48 : 0) + (pb - i >= 0 ? b[pb - i] - 48 : 0);
sumint[i] = sumint[i - 1] / 10;
sumint[i - 1] %= 10;
}
while (i > 0 && !sumint[i])i--; //抹掉前置0
for (; i >= 0; i--) //因为倒排,所以倒输出
printf("%d", sumint[i]);
if(td > 0)putchar('.'); //小数部分为零就没有小数点了
for (i = 1; i < td + 1; i++) //输出小数部分,sumdec[0]是进位信息,所以从下标1开始
printf("%d", sumdec[i]);
putchar('\n');
}

对宇宙最严谨的描述应该就是宇宙其实是不严谨的





