根据提示,在右侧编辑器补充代码,定义函数add_float(char* a, char* b, char* res)实现两个正浮点数a, b的精确加法。要求res字符串没有任何多余的前缀字符'0'和后缀字符'0'(即使结果像下面 sample 2 这样没有整数部分)。平台会对你编写的代码进行测试: 测试输入:0.1 0.9 预期输出: 1. 注意:不是1.0 测试输入:.01 .09 预期输出: .1 注意:不是0.1,也不是0.10
时间: 2023-06-11 07:10:38 浏览: 105
深入理解char *a与char a[]的区别
```c
#include <stdio.h>
#include <string.h>
void add_float(char* a, char* b, char* res) {
int len_a = strlen(a), len_b = strlen(b), len_res = 0;
int i = len_a - 1, j = len_b - 1, carry = 0;
while (i >= 0 || j >= 0 || carry) {
int x = (i >= 0) ? a[i--] - '0' : 0;
int y = (j >= 0) ? b[j--] - '0' : 0;
int sum = x + y + carry;
res[len_res++] = sum % 10 + '0';
carry = sum / 10;
}
// 去除结果中多余的前导0
while (len_res > 1 && res[len_res - 1] == '0') len_res--;
// 判断是否有小数点
if (strchr(a, '.') || strchr(b, '.')) {
// 计算小数点后的位数
int dot_pos = len_res;
if (dot_pos == 1) {
// 如果只有一位,那么前面补0
res[len_res++] = '0';
}
while (res[dot_pos - 1] != '.') dot_pos--;
int decimal_len = len_res - dot_pos;
// 如果小数点前面没有数字,那么补0
if (dot_pos == 1) {
memmove(res + 2, res + 1, decimal_len);
res[1] = '0';
len_res++;
}
// 去掉多余的后缀0
while (res[len_res - 1] == '0') len_res--;
// 如果最后一位是小数点,也去掉
if (res[len_res - 1] == '.') len_res--;
}
// 反转字符串
for (int k = 0; k < len_res / 2; k++) {
char t = res[k];
res[k] = res[len_res - k - 1];
res[len_res - k - 1] = t;
}
res[len_res] = '\0';
}
int main() {
char a[100], b[100], res[100];
scanf("%s %s", a, b);
add_float(a, b, res);
printf("%s\n", res);
return 0;
}
```
阅读全文