题解 | #浮点数加法#
浮点数加法
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8
- 将两个浮点数a b,分别分为整数和小数部分 分别存储在四个不同的数组中
- 将a b的 整数部分加和,存在数组SUM中(要保证每一位正确的对齐,需要逆序存储);将a b的 小数部分加和,存在数组sum中(这里注意小数的加和与整数部分不同,在位数不同的情况下,要保证每一位正确的对齐,需要正序存储)
- 先对小数部分处理进位,因为可能小数会向整数部分进位(若小数部分进位,则整数部分的个位+1)
- 分别输出整数部分和小数部分(记得加小数点)
#include <stdio.h> #include <memory.h> #define N 31 int A[N],B[N]; //存整数 int a[N],b[N]; //存小数 int SUM[N+1],sum[N+1]; //存和 char c; int main(){ memset(A, 0, sizeof(A)); memset(B, 0, sizeof(B)); memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(sum, 0, sizeof(sum)); int Alen,Blen,alen,blen,SUMlen,sumlen; //各数组长度 int i,j; //读入第一个数的整数 for (i = 0;;){ A[i] = getchar(); if (A[i] == '.')break; else i++; } Alen = i; //读入第一个数的小数 for (i = 0;;){ a[i] = getchar(); if (a[i] =='\n') break; else i++; } alen = i; //读入第二个数的整数 for (i = 0;;){ B[i] = getchar(); if (B[i] == '.')break; else i++; } Blen = i; //读入第二个数的小数 for (i = 0;;){ b[i] = getchar(); if (b[i] =='\n') break; else i++; } blen = i; SUMlen = Alen > Blen ? Alen : Blen; sumlen = alen > blen ? alen : blen; //小数加和 for (i = 0, j = 0; i < alen; i++, j++){ sum[j] += a[i]-'0'; } for (i = 0, j = 0; i < blen; i++, j++){ sum[j] += b[i]-'0'; } //小数进位 for (i = sumlen-1; i > 0; i--){ if(sum[i] > 9) sum[i-1] += sum[i]/10; sum[i] %= 10; } if (sum[0] > 9){ sum[0] %= 10; SUM[0] += 1; } //整数加和 for (i = Alen-1, j = 0; i >= 0; i--, j++){ SUM[j] += A[i]-'0'; } for (i = Blen-1, j = 0; i >= 0; i--, j++){ SUM[j] += B[i]-'0'; } //整数进位 for (i = 0; i < SUMlen; i++){ if(SUM[i] > 9) SUM[i+1] += SUM[i]/10; SUM[i] %= 10; if (SUM[SUMlen]) SUMlen++; } //输出 for (i = SUMlen-1; i >= 0;i--){ printf("%d",SUM[i]); } printf("."); for (i = 0; i < sumlen ;i++){ printf("%d",sum[i]); } }