根据提示,在右侧编辑器补充代码,定义函数add_float(char* a, char* b, char* res)实现两个正浮点数a, b的精确加法。 注意:只需要实现函数add_float,函数中没有任何输入输出。 函数的输入参数char* a和char* b都是用字符串表示的正浮点数。保证a, b一定都包含一个字符是小数点'.',保证其余字符全是0-9的数字。保证a, b不超过128个字符。 函数的输出参数char* res,保证浮点数a+b的结果不超过 128 个字符。 要求res字符串必须包含小数点'.'(即使结果是像下面 sample 1 这样并没有小数部分)。 要求res字符串没有任何多余的前缀字符'0'和后缀字符'0'(即使结果像下面 sample 2 这样没有整数部分)。 注意:虽然要求结果字符串res必须有小数点且没有任何前缀后缀0,但是并不保证字符串a, b满足这两点。
时间: 2023-06-12 14:06:03 浏览: 89
C++实现浮点数精确加法
5星 · 资源好评率100%
```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), dot_idx_a, dot_idx_b, i, j, k;
char int_part[129] = {0}, frac_part[129] = {0}, int_part_a[129] = {0}, int_part_b[129] = {0}, frac_part_a[129] = {0}, frac_part_b[129] = {0};
// 分离整数部分和小数部分
for(i=0; i<len_a; i++){
if(a[i] == '.'){
dot_idx_a = i;
break;
}
}
for(i=0; i<len_b; i++){
if(b[i] == '.'){
dot_idx_b = i;
break;
}
}
// 整数部分
strncpy(int_part_a, a, dot_idx_a);
strncpy(int_part_b, b, dot_idx_b);
// 小数部分
strncpy(frac_part_a, a+dot_idx_a+1, len_a-dot_idx_a-1);
strncpy(frac_part_b, b+dot_idx_b+1, len_b-dot_idx_b-1);
int len_int_a = strlen(int_part_a), len_int_b = strlen(int_part_b), len_frac_a = strlen(frac_part_a), len_frac_b = strlen(frac_part_b);
// 小数部分补齐
if(len_frac_a > len_frac_b){
for(i=0; i<len_frac_a-len_frac_b; i++){
frac_part_b[len_frac_b+i] = '0';
}
}
else if(len_frac_a < len_frac_b){
for(i=0; i<len_frac_b-len_frac_a; i++){
frac_part_a[len_frac_a+i] = '0';
}
}
int len_int = len_int_a > len_int_b ? len_int_a : len_int_b, len_frac = len_frac_a > len_frac_b ? len_frac_a : len_frac_b;
// 整数部分补齐
if(len_int_a > len_int_b){
for(i=0; i<len_int_a-len_int_b; i++){
int_part_b[len_int_b+i] = '0';
}
}
else if(len_int_a < len_int_b){
for(i=0; i<len_int_b-len_int_a; i++){
int_part_a[len_int_a+i] = '0';
}
}
int sum, carry = 0;
// 小数部分相加
for(i=len_frac-1; i>=0; i--){
sum = frac_part_a[i]-'0' + frac_part_b[i]-'0' + carry;
frac_part[i] = sum%10 + '0';
carry = sum/10;
}
// 整数部分相加
for(i=len_int-1; i>=0; i--){
sum = int_part_a[i]-'0' + int_part_b[i]-'0' + carry;
int_part[i] = sum%10 + '0';
carry = sum/10;
}
// 处理进位
if(carry){
for(i=len_int-1; i>=0; i--){
if(int_part[i] == '9'){
int_part[i] = '0';
}
else{
int_part[i]++;
carry = 0;
break;
}
}
if(carry){
int_part[0] = '1';
strcat(int_part, frac_part);
strcpy(res, int_part);
return;
}
}
strcat(int_part, ".");
strcat(int_part, frac_part);
// 去除多余的前缀0
len_int = strlen(int_part);
for(i=0; i<len_int-1; i++){
if(int_part[i] != '0'){
break;
}
}
if(int_part[i] == '.'){
i--;
}
if(i < 0){
int_part[0] = '0';
int_part[1] = '.';
int_part[2] = '0';
int_part[3] = '\0';
}
else{
for(j=0; j<len_int-i; j++){
int_part[j] = int_part[i+j];
}
int_part[j] = '\0';
}
// 去除多余的后缀0
len_int = strlen(int_part);
for(i=len_int-1; i>=0; i--){
if(int_part[i] == '.' || int_part[i] != '0'){
break;
}
}
int_part[i+1] = '\0';
strcpy(res, int_part);
}
int main(){
char a[129], b[129], res[129];
scanf("%s %s", a, b);
add_float(a, b, res);
printf("%s\n", res);
return 0;
}
```
阅读全文