题目链接:http://115.231.222.240:8081/JudgeOnline/problem.php?id=1470;
1470: 朋友Z与方程
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1131 Solved: 246
[ Submit][ Status][ Web Board]
Description
在朋友Z的信中她问了L先生一道题目,可惜L先生太笨,你能帮助他解决吗?
已知等式:6*x^3 + 5*x^2 + 7*x + 9 == Y 给出Y的值请求出x( 0≤x≤10)
Input
输入有多组测试数据,处理到文件结束(测试数据数量<=100000),每组测试数据给出一个浮点数Y(fabs(Y)<105)。Output
每行输出一个答案。
对于每个测试例如果存在满足条件的x,那么就输出x的值,并精确到小数点后4位,否则输出No solution! 。
Sample Input
100
-10
Sample Output
2.0877
No solution!
HINT
eps<=10-8
思路:牛顿迭代法;
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define eps 0.000001
double f(double x)
{
return 6*x*x*x+5*x*x+7*x+9;
}
int main()
{
double y;
while(~scanf("%lf",&y))
{
double l=0,r=10;
if(f(0)>y+eps||f(10)<y-eps)
puts("No solution!");
else
{
for(int i=0; i<50; i++)
{
double mid=(l+r)/2;
if(f(mid)>y)
r=mid;
else
l=mid;
}
printf("%.4f\n",l);
}
}
return 0;
}
关于牛顿迭代法:
参考:http://www.matongxue.com/madocs/205.html#/madoc;
上面的参考说的很详细;
以下是我根据参考的理解...
给一个函数然后求函数的零点;
在函数上随便选取一个点(xn,f(xn)),则这一点上的切线方程为y=f'(xn) (x-xn) + f(n);那么切线与x轴的交点就是x(n+1)=xn-f(xn)/f'(xn) ;
在根据(xn+1,f(xn+1))这个点找下一个近似根,那么到什么时候为止呢,就是前一个近似根与这个近似根的差接近为0时!
代码可以根据方程具体实现;
本题时给你了确定的y然后求x,可以用二分来求得x;
根据已知得方程可知这个函数时递增得,所以判断无解得条件是:
if(f(0)>y+eps||f(10)<y-eps)