如何简化二次方程格式化输出逻辑?减少if-else判断
二次方程格式化输出的简洁实现方案
问题描述
需要实现二次方程的格式化输出,规则如下:
- 系数为0时,不输出对应项
- 系数为1时,省略数字1
目前通过大量if-else语句处理,但组合场景过多,且难以覆盖系数0和1并存的情况,希望找到更简洁的实现方式。
当前冗余实现代码:
double a, b, c; printf("The quadratic equation is\n"); if (a == 0 && b != 0 && c != 0) printf("%.2lfX + %.2lf = 0\n", b, c); else if (b == 0 && a != 0 && c != 0) printf("%.2lfX^2 + %.2lf = 0\n", a, c); else if (c == 0 && a != 0 && b != 0) printf("%.2lfX^2 + %.2lfX = 0\n", a, b); else if (a == 0 && b == 0 && c !=0) printf("%.2lf = 0\n", c); else if (b == 0 && c == 0 && a != 0) printf("%.2lfX^2 = 0\n", a); else if (a == 0 && c == 0 && b != 0) printf("%.2lfX = 0\n", b); else if (a == 0 && b == 0 && c == 0) printf(""); else if (a == 1 && b != 1 && c != 1) { printf("X^2 + %.2lfX + %.2lf = 0\n", b, c); } else if (b == 1 && a != 1 && c != 1) { printf("%.2lfX^2 + X + %.2lf = 0\n", a, c); } else if (c == 1 && a != 1 && b != 1) { printf("%.2lfX^2 + %.2lfX + 1 = 0\n", a, b); } else if (a == 1 && b == 1 && c != 1) { printf("X^2 + X + %.2lf = 0\n", c); } else if (b == 1 && c == 1 && a != 1) { printf("%.2lfX^2 + X + 1 = 0\n", a); } else if (a == 1 && c == 1 && b != 1) { printf("X^2 + %.2lfX + 1 = 0\n", b); } else if (a == 1 && b == 1 && c == 1) { printf("X^2 + X + 1 = 0\n"); } else { printf("%.2lfX^2 + %.2lfX + %.2lf = 0\n", a, b, c); }
简洁实现思路
核心是逐个处理二次项、一次项、常数项,通过状态标记控制符号和输出逻辑,避免枚举所有组合:
- 用阈值判断浮点数是否为0或1,避免直接
==比较的精度问题 - 用
has_term标记是否已输出过项,控制项之间的+符号 - 每个项独立判断输出格式,无需依赖其他项的状态
实现代码
#include <stdio.h> #include <math.h> #define EPS 1e-6 // 浮点数比较的精度阈值 void print_quadratic(double a, double b, double c) { printf("The quadratic equation is\n"); int has_term = 0; // 处理二次项 if (fabs(a) > EPS) { if (fabs(a - 1.0) < EPS) { printf("X^2"); } else { printf("%.2lfX^2", a); } has_term = 1; } // 处理一次项 if (fabs(b) > EPS) { if (has_term) printf(" + "); if (fabs(b - 1.0) < EPS) { printf("X"); } else { printf("%.2lfX", b); } has_term = 1; } // 处理常数项 if (fabs(c) > EPS) { if (has_term) printf(" + "); printf("%.2lf", c); has_term = 1; } // 处理全零情况 if (!has_term) { printf("0 = 0"); } else { printf(" = 0"); } printf("\n"); } // 测试示例 int main() { print_quadratic(1.0, 1.0, 1.0); // X^2 + X + 1 = 0 print_quadratic(0.0, 2.0, 3.0); // 2.00X + 3.00 = 0 print_quadratic(2.0, 0.0, 3.0); // 2.00X^2 + 3.00 = 0 print_quadratic(1.0, 0.0, 0.0); // X^2 = 0 print_quadratic(0.0, 0.0, 0.0); // 0 = 0 return 0; }
关键细节说明
- 浮点数精度处理:用
EPS阈值替代直接==比较,避免因浮点数存储误差导致的判断错误 - 符号控制:
has_term变量确保只有在已有输出项时才添加+,避免开头出现多余符号 - 扩展性:如果需要支持负系数,只需在判断时添加符号逻辑,无需新增大量分支
内容的提问来源于stack exchange,提问作者AC7
相关产品推荐
相关产品推荐

