1 /* 2 * Main.c 3 * C8-循环-08. 二分法求多项式单根 4 * Created on: 2014年7月26日 5 * Author: Boomkeeper 6 *****部分通过******** 7 */ 8 #include <stdio.h> 9 #include <math.h> 10 11 float a3 = 0, a2 = 0, a1 = 0, a0 = 0; 12 13 double func(double x) { 14 return (a3 * pow(x, 3) + a2 * pow(x, 2) + a1 * x + a0); 15 } 16 17 18 int main(void) { 19 float a = 0, b = 0; //区间 20 float midvalue = 0; //midvalue=(a+b)/2 21 float threshold = 0; 22 23 scanf("%f%f%f%f%f%f", &a3, &a2, &a1, &a0, &a, &b); 24 25 do { 26 midvalue = (a + b) / 2; //计算中间值 27 if (func(a) * func(b) < 0) { 28 if (func(midvalue) == 0) { 29 printf("%.2f ", midvalue); 30 return 0; 31 } else { 32 if (func(midvalue) * func(a) > 0) { 33 //同号,说明偏左了,应当往右偏 34 a = midvalue; 35 threshold = fabs(a - b); //计算区间阀值 36 continue; 37 } 38 if (func(midvalue) * func(b) > 0) { 39 //同号,说明偏右了,应当往左偏 40 b = midvalue; 41 threshold = fabs(a - b); //计算区间阀值 42 continue; 43 } 44 } 45 } 46 } while (threshold > 0.0001); 47 /** 48 * 因为threshold小到一定程度后,说明a、b可以看做成一点,也就是题目中f(r)=0的r点。 49 */ 50 printf("%.2f ",(a+b)/2); 51 52 return 0; 53 }
有更好方法的大虾们,希望指点,我试过将 1 while (threshold > 0.0001); 提高精度,测试结果仍然一样,我想还是算法上可能还有问题。
题目链接:
http://pat.zju.edu.cn/contests/basic-programming/%E5%BE%AA%E7%8E%AF-08