HDU 2199 Can you solve this equation? にぶん
主に二分思想+浮動小数点数精度制御の練習
Can you solve this equation?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7029 Accepted Submission(s): 3266
Problem Description
Now,given the equation 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,can you find its solution between 0 and 100;
Now please try your lucky.
Input
The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has a real number Y (fabs(Y) <= 1e10);
Output
For each test case, you should just output one real number(accurate up to 4 decimal places),which is the solution of the equation,or “No solution!”,if there is no solution for the equation between 0 and 100.
Sample Input
Sample Output
この方程式の単調性はよく証明され,絶えず導出することは容易に証明され,単調内で解くには二分を用い,主に種々の精度制御を試みた.
Can you solve this equation?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7029 Accepted Submission(s): 3266
Problem Description
Now,given the equation 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,can you find its solution between 0 and 100;
Now please try your lucky.
Input
The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has a real number Y (fabs(Y) <= 1e10);
Output
For each test case, you should just output one real number(accurate up to 4 decimal places),which is the solution of the equation,or “No solution!”,if there is no solution for the equation between 0 and 100.
Sample Input
2
100
-4
Sample Output
1.6152
No solution!
この方程式の単調性はよく証明され,絶えず導出することは容易に証明され,単調内で解くには二分を用い,主に種々の精度制御を試みた.
#include <cstdio>
#include <cmath>
#include <cstdlib>
const double eps = 1e-7;
double cal(double x){
return 8*pow(x,4.0)+7*pow(x,3.0)+2*pow(x,2.0)+3*x+6.0;
}
int main(){
int t;
double low,high,mid,y,res;
scanf("%d",&t);
while(t--){
scanf("%lf",&y);
if(y<cal(0.0) || y>cal(100.0)){
printf("No solution!
");
continue;
}
low = 0.0;
high = 100.0;
while(high-low>eps){
mid = (low+high)/2;
res = cal(mid);
if(res<y){
low = mid + 1e-7;
}else{
high = mid - 1e-7;
}
}
printf("%0.4lf
",mid);
}
return 0;
}