可恶的红色
查看原帖
可恶的红色
1007656
U_stinian楼主2023/8/13 22:59
#include <iostream>
#include <cmath>
using namespace std;
// 计算一元三次方程的实数根
void solution(double a, double b, double c, double d) {
    double discriminant, p, q, phi, x1, x2, x3;
    discriminant = 18*a*b*c*d - 4*pow(b, 3)*d + pow(b, 2)*pow(c, 2) - 4*a*pow(c, 3) - 27*pow(a, 2)*pow(d, 2);
    p = (3*a*c - pow(b, 2))/(3*pow(a, 2));
    q = (2*pow(b, 3) - 9*a*b*c + 27*pow(a, 2)*d)/(27*pow(a, 3));

    if (discriminant > 0 || (discriminant == 0 && p != q)) {
        phi = atan2(sqrt(discriminant), q);
        x1 = -2*sqrt(p/3)*cos(phi/3) - b/(3*a);
        x2 = -2*sqrt(p/3)*cos((phi + 2*M_PI)/3) - b/(3*a);
        x3 = -2*sqrt(p/3)*cos((phi - 2*M_PI)/3) - b/(3*a);

        cout<<x1<<" "<<x2<<" "<<x3;
    }
    else if (discriminant == 0 && p == q) {
        x1 = pow(d/a, 1/3) * -1;
        x2 = pow(d/a, 1/3) * -1;
        x3 = pow(d/a, 1/3) * -1;

        cout<<x1<<" "<<x2<<" "<<x3;
    }
    else {
        double r = sqrt(pow(q, 2) - pow(p, 3));
        double s = pow((q + r), 1/3);
        double t = pow((q - r), 1/3);

        x1 = (s + t) - (b/(3*a));
        x2 = -(s + t)/2 - (b/(3*a)) + (sqrt(3)*(s - t))/2;
        x3 = -(s + t)/2 - (b/(3*a)) - (sqrt(3)*(s - t))/2;

        cout<<x1<<" "<<x2<<" "<<x3;
    }
}

int main() {
    double a, b, c, d;
    cin>>a>>b>>c>>d;
    solution(a,b,c,d);
    return 0;
}

2023/8/13 22:59
加载中...