题目
分析
可以先确定它在哪2个整数之间,再精确小数位。
代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
int main()
{
int a,i;
double b,k,j,x;
i=1;
while(2*i*i*i-5*i*i+3*i-6<0)i++;//先找出它在哪两个整数之间
x=i;
j=x-1;
while(2*j*j*j-5*j*j+3*j-6<0)
j+=0.00001;
x=j;
k=x-0.00001;
for(;;k+=0.000001)//使其精确到0.00001
{
b=2*k*k*k-5*k*k+3*k-6;
if(b>=-0.00001&&b<=0.00001)
{
cout<<k;
return 0;//找到答案,可以直接返回
}
}
return 0;
}
结果
纠正
徐哥分析,这个代码应该是有问题的(笑哭),原题是x轴上与根的距离小于精度,我的做法是y轴上与跟的距离小于精度。所以,我还是用二分逼近法吧。
代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
int main()
{
int a,i;
double b,k,j;
double x1,x2;
i=1;
while(2*i*i*i-5*i*i+3*i-6<0)i++;//先找出它在哪两个整数之间 ,其实这个过程可以省略
x1=i-1;
x2=i;
for(;;)
{
k=(x1+x2)/2;
b=2*pow(k,3)-5*k*k+3*k-6;
if(b<0)x1=k;
else if(b>0)x2=k;
if(fabs(x1-x2)<=0.00001)
{
cout<<x1;
return 0;
}
}
return 0;
}
结果
当然还有其它解法,可以看看他们写的
解方程 ( 迭代法/牛顿迭代/高斯消元 ) 详解及模板
算法分析与设计-迭代法求解方程(组)的根(详解)