一元三次方程求解代码如下:
#include<stdio.h>
#include<math.h>
int main() {
double a, b, p, q, x1, m, n, i, w, s1, s2, s3;
printf("请输入一元三次方程标准形式ax^3+bx^2+px+q=0\n");
printf("a b p q的值,用空格隔开,其中a的值为1,b的值为0\n");
scanf("%lf%lf%lf%lf", &a, &b, &p, &q);
m = (3 * a * p - b * b) / (3 * a * a);
n = (27 * a * a * q - 9 * a * b * p + 2 * b * b * b) / (27 * a * a * a);
w = -0.5;
s1 = -b / (3 * a);
if (-n / 2 + sqrt(n * n / 4 + m * m * m / 27) > 0)
{
s2 = pow((-n / 2 + sqrt(n * n / 4 + m * m * m / 27)), 1.0 / 3);
}
else
{
s2 = -pow(-(-n / 2 + sqrt(n * n / 4 + m * m * m / 27)), 1.0 / 3);
}
if (-n / 2 - sqrt(n * n / 4 + m * m * m / 27) > 0)
{
s3 = pow((-n / 2 - sqrt(n * n / 4 + m * m * m / 27)), 1.0 / 3);
}
else
{
s3 = -pow(-(-n / 2 - sqrt(n * n / 4 + m * m * m / 27)), 1.0 / 3);
}
x1 = s1 + s2 + s3;
printf("x1的解为:%f\n", x1);
}
这道题应该用牛顿迭代公式来做。由于p, q的数值可以很大,如果直接套公式的话,在计算平方和三次方时就会数值溢出。
#include <stdio.h>
#include <math.h>
int p, q;
double f(double x)
{
return x * x * x + p * x + q;
}
double f1(double x)
{
return 3.0 * x * x + p;
}
int main()
{
double x_n = 1, x_n1;
scanf("%d%d", &p, &q);
while (1)
{
x_n1 = x_n - f(x_n) / f1(x_n);
if (fabs(x_n1 - x_n) < 0.0005)
break;
x_n = x_n1;
}
printf("%.3f", x_n1);
return 0;
}
#include<stdio.h>
#include<math.h>
void main()
{
int p,q; //取值为integer的最值
printf("请输入p和q\n"); scanf("%d%d",&p,&q);
printf("公式如下: x^3+%dx+%d=0 ",p,q); //根据题意判断式要大于零既求一个实数根和两个共轭虚根,共轭虚根可忽略
float result;
if((q*q/4.0+p*p*p/27.0)>0)
{
result=pow((-q/2.0+sqrt((q*q/4.0)+(p*p*p)/27.0)),1/3.0)+pow((-q/2.0-sqrt((q*q/4.0)+(p*p*p)/27.0)),1/3.0);
printf("%.3f",result);
}
}
其实你可以直接百度一元三次百度百科,里面有详细介绍。不懂再问