首页 > 代码库 > *循环-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. 二分法求多项式单根
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。