程序代码:
#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'); }
对宇宙最严谨的描述应该就是宇宙其实是不严谨的