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

   
   
   
   
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; }