You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化二次方程格式化输出逻辑?减少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);
}

简洁实现思路

核心是逐个处理二次项、一次项、常数项,通过状态标记控制符号和输出逻辑,避免枚举所有组合:

  1. 用阈值判断浮点数是否为0或1,避免直接==比较的精度问题
  2. 用has_term标记是否已输出过项,控制项之间的+符号
  3. 每个项独立判断输出格式,无需依赖其他项的状态

实现代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:10:29