题目描述 给你两个正的小数A和B,你的任务是计算出A+B的值。 输入 本题目包含多组测试数据,请处理到文件结束。 每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。 输出 请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。 样例输入 1.1 2.9 1.1111111111 2.3444323343 1 1.1 样例输出 4 3.4555434454 2.1用c语言实现
时间: 2024-03-22 14:39:25 浏览: 166
好的,这个问题我可以帮您解决。您可以将以下代码保存为一个.c文件,然后通过命令行编译运行该程序,输入两个小数,程序将会输出它们的和。
``` c
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 410
int main() {
char a[MAX_LENGTH], b[MAX_LENGTH];
while (scanf("%s %s", a, b) != EOF) {
int len_a = strlen(a), len_b = strlen(b);
int dot_a = -1, dot_b = -1;
for (int i = 0; i < len_a; i++) {
if (a[i] == '.') {
dot_a = i;
break;
}
}
for (int i = 0; i < len_b; i++) {
if (b[i] == '.') {
dot_b = i;
break;
}
}
if (dot_a == -1) {
dot_a = len_a;
}
if (dot_b == -1) {
dot_b = len_b;
}
int len_int_a = dot_a, len_int_b = dot_b;
while (len_int_a > 0 && a[len_int_a - 1] == '0') {
len_int_a--;
}
while (len_int_b > 0 && b[len_int_b - 1] == '0') {
len_int_b--;
}
int len_decimal_a = len_a - dot_a - 1, len_decimal_b = len_b - dot_b - 1;
while (len_decimal_a > 0 && a[len_a - len_decimal_a] == '0') {
len_decimal_a--;
}
while (len_decimal_b > 0 && b[len_b - len_decimal_b] == '0') {
len_decimal_b--;
}
int len_int = len_int_a > len_int_b ? len_int_a : len_int_b;
int len_decimal = len_decimal_a > len_decimal_b ? len_decimal_a : len_decimal_b;
char ans[MAX_LENGTH];
int idx = 0;
int carry = 0;
for (int i = 0; i < len_int || i < len_decimal; i++) {
int digit_a = i < len_int_a ? a[len_a - i - 1] - '0' : 0;
int digit_b = i < len_int_b ? b[len_b - i - 1] - '0' : 0;
int digit_decimal_a = i < len_decimal_a ? a[dot_a + 1 + i] - '0' : 0;
int digit_decimal_b = i < len_decimal_b ? b[dot_b + 1 + i] - '0' : 0;
int digit = digit_a + digit_b + carry;
if (i < len_decimal || digit_decimal_a + digit_decimal_b > 0) {
digit += digit_decimal_a + digit_decimal_b;
if (digit >= 10) {
digit -= 10;
carry = 1;
} else {
carry = 0;
}
ans[idx++] = digit + '0';
}
}
if (carry == 1) {
ans[idx++] = '1';
}
if (idx == 0) {
printf("0\n");
} else {
for (int i = idx - 1; i >= 0; i--) {
printf("%c", ans[i]);
}
if (len_decimal > 0) {
printf(".");
for (int i = 1; i <= len_decimal; i++) {
int digit_a = i <= len_decimal_a ? a[dot_a + i] - '0' : 0;
int digit_b = i <= len_decimal_b ? b[dot_b + i] - '0' : 0;
int digit = digit_a + digit_b + carry;
if (digit >= 10) {
digit -= 10;
carry = 1;
} else {
carry = 0;
}
printf("%d", digit);
}
}
printf("\n");
}
}
return 0;
}
```
代码中,我们首先读入两个小数,并找出它们小数点的位置。然后,我们分别计算它们的整数部分和小数部分的长度,并去除多余的零。接下来,我们将整数部分和小数部分分开计算,并将它们加起来。最后,我们将结果输出。
需要注意的是,由于小数的精度可能很高,因此我们需要用数组来存储小数。在输出小数部分时,我们需要根据其实际长度来输出。如果小数部分的值为零,则不需要输出小数点以及小数部分。
阅读全文