题目描述
C语言就要期末考试了,经过一学期的学习,小南学会了分数相加、分数相减、大整数相加,可就是没有尝试过将两个最大达400位的实数相加。在调试过程中,小南遇到了很多问题,一直解决不了。你能帮他编写一个程序实现两个实数相加吗?
输入
多组样例。每行输入一个样例包括两个用空格分开的实数x和y,其中x和y是长度不大于400位的非负实数。注意,非负实数中也可能包括非负整数,正整数会省略小数点和后面的0,只包括整数部分。
输出
对于每一行输入,输出两个实数x和y相加的结果。输出结果中整数部分的前面和小数部分的末尾不输出多余的0;如果是整数,不输出小数点和小数点后面的0。每个输出占一行。
样例输入 Copy
1.1 2.9 1.1111111111 2.3444323343 1 1.1 1.1111 1.1889
样例输出 Copy
4 3.4555434454 2.1 2.3
#include <stdio.h> #include<string.h> int main(void) { char x[405]={0}, y[405]={0}; while (~scanf("%s %s", x, y)) { int l1 = strlen(x), l2 = strlen(y); char x1[405] = { 0 }, x2[405] = { 0 }; int i=l1, j=l2; for (int k = 0; k < l1; k++){ if (x[k] == '.'){ i = k; break; } } for (int k = 0; k < i; k++){ x1[k] = x[k]; } for (int k = i + 1; k < l1; k++){ x2[k-i-1] = x[k]; } char y1[405] = { 0 }, y2[405] = { 0 }; for (int k = 0; k < l2; k++){ if (y[k] == '.') { j = k; } } for (int k = 0; k < j; k++){ y1[k] = y[k]; } for (int k = j + 1; k < l2; k++){ y2[k - j - 1] = y[k]; } int r1[405] = { 0 }, t=0; int p = i - 1, q = j - 1; int r2[405] = { 0 }, t2 = 0; int len; if (l1 - i > l2 - j) len = l1 - 1 - i-1; else len = l2 - 1 - j-1; while (len >= 0){ int g=x2[len], r=y2[len]; if (x2[len] == 0) g = '0'; if (y2[len] == 0) r = '0'; r2[t2] = r2[t2]+g - '0' + r - '0'; if (r2[t2] >= 10) { r2[t2] %= 10; r2[t2 + 1]++; } t2++,len--; } if (r2[t2] != 0) { r1[0] = r1[0] + 1; } while (p >= 0 && q >= 0){ r1[t] = r1[t] + x1[p] - '0' + y1[q] - '0'; if (r1[t] >= 10) { r1[t] = r1[t] % 10; r1[t + 1]++; } t++, p--, q--; } while (p >= 0){ r1[t] = r1[t] + x1[p] - '0'; t++, p--; } while (q >= 0){ r1[t] = r1[t] + y1[q] - '0'; t++, q--; } if (r1[t] == 0) t = t - 1; for (t; t >= 0; t--) printf("%d", r1[t]); int fir = 0; while (r2[fir] == 0&&fir<t2) fir++; if (fir != t2){ printf("."); int j = t2 - 1; for (j; j >= fir; j--) printf("%d", r2[j]); } printf("\n"); } return 0; }
标签:r1,r2,实数,相加,++,len,int,405 From: https://www.cnblogs.com/messing1758954258/p/16966178.html