首页 > 代码库 > *循环-08. 二分法求多项式单根

*循环-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 = http://www.mamicode.com/0; //midvalue=http://www.mamicode.com/(a+b)/221     float threshold = 0;22 23     scanf("%f%f%f%f%f%f", &a3, &a2, &a1, &a0, &a, &b);24 25     do {26         midvalue = http://www.mamicode.com/(a + b) / 2; //计算中间值27         if (func(a) * func(b) < 0) {28             if (func(midvalue) == 0) {29                 printf("%.2f\n", 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\n",(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

 

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