#include <stdio.h> double f(double x) { return 8*x*x*x*x+7*x*x*x+2*x*x+3*x+6;//列出题目的算式,下面的f(100)和f(0)、f(mid)都是这个的值。 } void pp() { double wbx,cc;//定义变量 int n; double y;;// 定义变量 double mid;//定义变量 scanf("%d",&n);//输入N代表案例个数 while(n--) { scanf("%lf",&y);//输入Y。 wbx=100.0; cc=0.0; if(y>f(100) ||y<f(0))//题目要求:如果Y的值大于f(100)或者小于f(0)则继续。 { printf("No solution!\n");//没有所求的X。 continue; } while(wbx-cc>1e-8)// 2分开始了,1e-8代表10的负8次方。取得越小越好,这样值才足够的精确。当这两个值相差大于1e-8时,不断的循环下面的操作。 { mid=(wbx+cc)/2.0;// 让mid等于两个和的一半。 if(f(mid)>y) //如果这f(mid)大于Y的话 { wbx=mid-1e-8;//让大的那个减小。 } else { cc=mid+1e-8;//否则让小的那个增加。 } } printf("%.4lf\n",mid);// 跳出循环后f(mid)自然等于Y了(可精确到小数点后7、8位吧)。而mid就是我们所求的x。题目只要保留4位小数就好了。四位时所求的mid和x的值一定是相等的。 } } int main() { pp();//解决问题。 }
原文地址:http://blog.csdn.net/sky_miange/article/details/41961783