300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 解方程(二分法) HDU

解方程(二分法) HDU

时间:2019-12-25 14:11:38

相关推荐

解方程(二分法)  HDU

Problem Description

给定方程 8x4+ 7x3+ 2x2 + 3x + 6 == Y,请计算x在[0,100]范围内的解。

Input

输入数据首先是一个正整数T(1<=T<=100),表示有T组测试数据。

接下来T行,每行包含一个实数Y ( fabs(Y) <= 1e10 )。

Output

请计算并输出方程在范围[0,100]内的解,结果精确到小数点后4位。

如果无解,则请输出“No solution!”

Sample Input

2

100

-4

Sample Output

1.6152

No solution!

首先这个题,我们先想用什么方法,我们可以使用枚举,而枚举效率过低,我们发现这个函数在[0,100]之间是单调递增的,因此数列有序,我们可以使用二分法去查找最合适的答案,并且把误差控制在1e-4之内。注意这个No solution!情况的判别,我在这居然卡了好久。因为我以为fn(0)就是0,结果半天才检查出来。
因为我们要保留小数点到后四位,所以在循环中我们要控制精度最好在小数点后6~7位。注意输入的数据y是个实数,不是整数。

#include<bits/stdc++.h>using namespace std;double fn(double x){return 8*pow(x,4.0)+7*pow(x,3.0)+2*pow(x,2.0)+3*x+6;}int main(){int t;cin>>t;while(t--){double y;cin>>y;double mid;if(y>=fn(0)&&fn(100)>=y){double left=0;double right=100;while(right-left>1e-8){mid=(left+right)/2;if(fn(mid)>y)right=mid-1e-9;else if(fn(mid)<y)left=mid+1e-9;elsebreak;}printf("%.4lf\n",(left+right)/2);}elsecout<<"No solution!\n";}return 0;}

更新一下~~~~

还有一种判断方法

判断

abs(8*mid*mid*mid*mid+7*mid*mid*mid+2*mid*mid+3*mid+6-y)>=1e-5

时循环停止。注意一定要加绝对值。

#include<bits/stdc++.h>using namespace std;int main(){int t;double low,high,mid,y;cin>>t;while(t--){cin>>y;mid=100;if(8*mid*mid*mid*mid+7*mid*mid*mid+2*mid*mid+3*mid+6<y||y<6){cout<<"No solution!"<<endl;continue;}low=0;high=100;mid=(low+high)/2;while(abs(8*mid*mid*mid*mid+7*mid*mid*mid+2*mid*mid+3*mid+6-y)>=1e-5){if(8*mid*mid*mid*mid+7*mid*mid*mid+2*mid*mid+3*mid+6>y){high=mid-1e-10;}else if(8*mid*mid*mid*mid+7*mid*mid*mid+2*mid*mid+3*mid+6<y){low=mid+1e-10;}else break;mid=(low+high)/2;}printf("%.4lf\n",mid);}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。