#include <stdio.h>
#include <math.h>
// 求ax^2+bx+c=0的方程的解
int main() {
double a, b, c, disc, x1, x2, realpart, imagpart;
scanf("%1f, %1f, %1f", &a, &b, &c);
printf("the equation");
if (fabs(a) <= 1e-6) { //如果二次的系数极小
printf("is not quadratic\n"); //不是二次
}
else {
disc = b * b - 4 * a * c; // 判别式
if (fabs(disc) <= 1e-6) { // 如果判别式 近似等于0
printf("has two equal roots:%8.4f\n", -b / (2 * a)); //那么方程有两个相等的根
}
else {
if (disc > 1e-6) { // 如果判别式大于0
x1 = (-b + sqrt(disc)) / (2 * a); // 负b加减根号下b方减4ac
x2 = (-b - sqrt(disc)) / (2 * a);
printf("has distinct real roots:%8.4f and %8,4f\n",x1, x2); // 有两个不同的实根
}
else {
realpart = -b / (2 * a);
imagpart = sqrt(-disc) / (2 * a);
printf("has complex roots:\n");
printf("%8.4f+8.4fi\n", realpart, imagpart);
printf("%8.4f-8.4fi\n", realpart, imagpart);
}
}
}
return 0;
}
//弦截法
double x, x1, x2;
// 求f(x)的值
double fx(double x) {
double y;
y = x * x * x - 5 * x * x + 16 * x - 80;
return(y);
}
double root(double x1, double x2) {
do
{
double k, b; // (x1, f(x1))与(x2, f(x2))两点连线的方程设为y=kx+b
k = fx(x1) - fx(x2) / x1 - x2;
b = fx(x1) - k * x1;
x = -b / k; //求连线与x轴的交点
if (fx(x) * fx(x1) < 0) { // 如果f(x)与f(x1)异号,则根必在x与x1之间
x2 = x; // 将x的值赋给x2
}
else // 否则f(x)与f(x1)同号,则根必在x与x2之间
{
x1 = x; // 将x的值赋给x1
}
} while ((fabs(fx(x)) > 0.0000001)); //循环,直到|f(x)| < 一个极小的值 f(x)约等于0
}
int main()
{
while (fx(x1) * fx(x2) >= 0)
{
scanf("%lf%lf", &x1, &x2);// // 如果选择的x1与x2得出的f(x1)与f(x2)同号,则继续输入
}
root(x1, x2);
printf("%f", x); // float %f double %lf
return 0;
}
C语言-求一元二次方程-弦截法求一元三次方程
最新推荐文章于 2023-10-12 16:44:47 发布