如何修改 C 中的二次公式程序,使其在整个程序中只计算一次平方根?

How can I modify my quadratic formula program in C to only calculate the square root once in the entire program?

我是这个网站的新手,我正在尝试挑战以改进我的二次方程程序在此处已有的内容。它已经按照我需要的方式运行,但我试图学习如何在不利用我的课程尚未涵盖的内容的情况下尽我所能地改进它。

我的老师声称有多种方法可以解决这个问题,而无需使用 sqrt 函数的一行以上的代码,我已经为此困惑了一段时间。如果没有至少两行具有 sqrt() 的代码,我似乎无法找到执行该程序的方法。

如果有人有任何建议或愿意引导我朝着正确的方向前进,将不胜感激!

// Quadratic formula program redone
// Filename: quadeq3.cpp

#include <stdio.h>
#include <math.h>

main()
{
    float a,b,c,r1,r2,root = 0,disc,disc2,denom,real;

    while(1)
    {
        // Get the values for a, b, c

        printf("\nEnter value for a: ");
        scanf("%f",&a);
        if (a == 0) break;                   // Break the loop if a == 0

        printf("Enter value for b: ");
        scanf("%f",&b);

        printf("Enter value for c: ");
        scanf("%f",&c);

        denom = 2*a;                         // Calculate 2a
        disc = (b*b)-(4*a*c);                // Calculate the discriminant
        real = -b / denom;                   // Calculate the real (left) root

        disc2 = -disc;                       // Used for case 3 imaginary roots
        if (disc >= 0) root = sqrt(disc);    // If not imaginary, use disc
        if (disc < 0) root = sqrt(disc2);    // If imaginary, use disc2

        printf("\na = %2.1f",a);
        printf("\nb = %2.1f",b);
        printf("\nc = %2.1f",c);

        // Case 1: discriminant > 0, 2 real roots

        if (disc > 0)
        {
            r1 = (-b-root)/denom;
            r2 = (-b+root)/denom;
            printf("\n\n2 Real Roots:\n");
            printf("\n%2.1f, %2.1f\n",r1,r2);
            continue;
        }

        // Case 2: discriminant == 0, 1 real root

        if (disc == 0)
        {
            printf("\n\n1 Real Root:\n");
            printf("\n%2.1f\n",real);
            continue;
        }

        // Case 3: discriminant < 0, imaginary roots

        r2 = root/denom;
        printf("\n\nImaginary Roots:\n");
        printf("\n%2.1f + %4.3fi,%2.1f - %4.3fi\n",real,r2,real,r2);
    }

    // End the program

    printf("\nNot a quadratic formula, program terminated!\n");
    return(0);
}

程序实际运行时,您实际上只计算平方根一次

如果你只想在程序源代码中看到sqrt一次,那么使用

root = sqrt(fabs(disc));

相反。 fabs 计算浮点数的绝对值。

如果您想保持当前的代码结构:

if (disc < 0) disc2 = -disc;
else disc2 = disc;
root = sqrt(disc2);