#include<stdio.h> #include<string.h> typedef struct { char S1[60];//存储整数部分 char S2[60];//存储小数部分 } dnum; char* min(char* S1, char* S2) { if (strlen(S1) > strlen(S2))return S2; return S1; } char* max(char* S1, char* S2) { if (strlen(S1) > strlen(S2))return S1; return S2; } void add1(char* str1, char* str2) {//计算小数部分 int i; for (i = 0; i < strlen(str2); i++) { str1[strlen(str2) - 1 - i] += str2[strlen(str2) - 1 - i] - '0'; } for (i = strlen(str1) - 1; i > 0; i--) { if (str1[i] >= '0' + 10) { str1[i - 1] += (str1[i] - '0') / 10; str1[i] = '0' + (str1[i] - '0') % 10; } } } void add2(char* str1, char* str2) {//计算整数部分 int i; for (i = 0; i < strlen(str2); i++) { str1[strlen(str1) - 1 - i] += str2[strlen(str2) - 1 - i] - '0'; } for (i = strlen(str1) - 1; i > 0; i--) { if (str1[i] >= '0' + 10) { str1[i - 1] += (str1[i] - '0') / 10; str1[i] = '0' + (str1[i] - '0') % 10; } } } int main() { dnum A[2]; int i, j, n = 2; for (i = 0; i < 2; i++) { for (j = 0; j < 40; j++)A[i].S1[j] = A[i].S2[j] = '\0'; } for (i = 0; i < 2; i++)gets(A[i].S1); for (i = 0; i < 2; i++) { for (j = 0; A[i].S1[j] != '.'; j++); j++; strcat(A[i].S2, &A[i].S1[j]); j--; for (; j < strlen(A[i].S1); j++)A[i].S1[j] = '\0'; } char* str1 = max(A[0].S2, A[1].S2); char* str2 = min(A[0].S2, A[1].S2); add1(str1, str2);//小数部分相加 int flag = 0; if (str1[0] >= '0' + 10) { flag += (str1[0] - '0') / 10;//小数部分进位 str1[0] = (str1[0] - '0') % 10 + '0'; } char* a = str1; str1 = max(A[0].S1, A[1].S1); str2 = min(A[0].S1, A[1].S1); str1[strlen(str1) - 1] += flag; flag = 0; add2(str1, str2);//整数部分相加 if (str1[0] >= '0' + 10) { flag += (str1[0] - '0') / 10;//整数部分进位 str1[0] = (str1[0] - '0') % 10 + '0'; } if (flag != 0)printf("%d", flag);//若整数部分有进位,输出 printf("%s.%s\n", str1, a); return 0; }