*循环-08. 二分法求多项式单根*


 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

原文地址:https://www.cnblogs.com/boomkeeper/p/C8.html