今天是二分法专题第一天,感觉二分法比搜索简单多了,但是精度的控制还是要注意细节,比如说今天我做了一道题,输出结果跟答案老是差0.0001,怎么也检查不出来哪里错了,但答案就是不对,精度改了还是不对...
还有今下午做比赛,第一题用到蔡勒公式???!!这是哪里出来的公式???还有一道深搜题老是做不出来,最后终于改对了。。。今天挺疲惫的(比赛累的)。
贴上我怎么改都wrong answer的题吧:
Can you solve this equation?
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 51 Accepted Submission(s) : 24
Now please try your lucky.
2 100 -4
1.6152 No solution!
AC代码:
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;
double cal(double x)
{
return 8*x*x*x*x+7*x*x*x+2*x*x+3*x+6;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double n;
scanf("%lf",&n);
if(cal(0)>n || cal(100)<n)
{
printf("No solution!\n");
continue;
}
double l = 0.0,r = 100.0;
double mid = (l+r)/2;
while(fabs(cal(mid)-n)>1e-5)
{
if(cal(mid)>n)
r = mid-1;
else
l = mid+1;
mid = (l+r)/2;
}
printf("%.4f\n",mid);
}
return 0;
}
我的代码(不知道哪里出错了):
/*#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
using namespace std;
double y;
double f(double x)
{
return (8*pow(x,4)+7*pow(x,3)+2*pow(x,2)+3*x+6-y);
}
int main()
{
int n;
cin>>n;
while(n--)
{ double x;
double l,r,xx;
cin>>y;
if(f(0)>0||f(100)<0) cout<<"No solution!"<<endl;
for(x=0;x<=100;x++)
{
l=x;r=x+1;
if(f(l)==0)
printf("%.4lf",l);
else if(f(l)*f(r)<0)
{
while(r-l>=0.00001)
{
xx=(r+l)/2;
if((f(l)*f(xx))<=0)r=xx;
else l=xx;
}
cout<<fixed<<setprecision(4)<<l<<endl;
}
}
}
return 0;
}
我的(错误)输出(输入100,输出的是1.6151)
而正确的是1.6152!哪位大神帮我看看...