题目描述:
有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10至10之间),并且根与根之差的绝对值 ≥ 1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后3位。
提示:记方程f(x) = 0,若存在2个数x1和x2,且x1 < x2,f(x1)*f(x2) < 0,则在(x1,x2)之间一定有一个根。
输入:
有一组数据包含4个实数,分别为a、b、c、d的值。
输出:
方程的根,保留3位小数。
样例输入:
2 -4 3 -6
样例输出:
2.000
这个程序涉及了数学运算因此要在开始加上数学库,并将基本格式打好:
#include<stdio.h>
#include<math.h>
int main()
{
return 0;
}
由于题目要求要有三位小数点所以我们要用double来定义,而且我们输出时要用% lf来对应double,程序如下
double x1,x2,a,b,c,d,i,fx1,fx,x;
x1=-10;
x2=10;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
为了方便简洁我们接下来用for语句来进行循环先将i赋值为1,再让程序在i小于等于100时一直自增循环直到得到理想的精度值,并把x用x1,x2表示,把fx,fx1这两个方程表示出来。接下来用if嵌套语句来进行输出,在第一个if条件时要用1e-8来确认fx的精度。然后用第二和第三个if语句对fx和fx1的乘及正负值进行判断,假如fx和fx1的乘积为正,则x=x1;假如fx和fx1的乘积为负,则x2=x。程序如下:
for(i=1;i<=100;i++)
{
x=(x1+x2)/2;
fx1=a*x1*x1*x1+b*x1*x1+c*x1+d;
fx=a*x*x*x+b*x*x+c*x+d;
if(fabs(fx)<1e-8){
}
else if(fx*fx1>0){
x1=x;
}
else if(fx*fx1<0){
x2=x;
}
在最后输出时要看清题目保留3位小数,并用%lf来对应double,程序如下:
printf("%.3lf",x);
最后将代码总结输出:
#include<stdio.h>
#include<math.h>
int main()
{
double x1,x2,a,b,c,d,i,fx1,fx,x;
x1=-10;
x2=10;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
for(i=1;i<=100;i++)
{
x=(x1+x2)/2;
fx1=a*x1*x1*x1+b*x1*x1+c*x1+d;
fx=a*x*x*x+b*x*x+c*x+d;
if(fabs(fx)<1e-8){
}
else if(fx*fx1>0){
x1=x;
}
else if(fx*fx1<0){
x2=x;
}
}printf("%.3lf",x);
return 0;
}
这个解一元三次方程让我加深了对for语句,if的嵌套语句的熟练度,并让我对循环语句的理解更进一步,也让我对c语言产生了更浓厚的兴趣。让我有了学下去的动力,经过c语言的学习,我觉得万物皆可代码化,程序员就是要把世间的一切用代码表示出来。在一个到处是OOP的年代,为何面向过程的C语言依然可以如此活跃?这主要得益于C语言本身的语言特性。C语言小巧灵活,而且还有一个直接与硬件打交道的指针的存在,所以它是嵌入式开发唯有的高级语言;正因为他的小巧灵活,我们可以用它来开发一系列的小工具,Unix/Linux就是由这些小工具组成的操作系统;同时用C语言可以开发高性能的应用程序。