中国大学MOOC-数据结构基础习题集、03-1、二分法求多项式单根
2014-12-21 14:20
239 查看
首先粘一下题目:
二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。
二分法的步骤为:
检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a, (a+b)/2],令b=(a+b)/2,重复循环;
本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a, b]内的根。
输入格式:
输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。
输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。
输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33
注意事项:
1. 题目中要求精确到小数点后2位,因此要#define或者const一个常量,#define EPS 1e-3或者const double EPS=1e-3。用这个常量判断区间的大小。亦即当(a,b)区间长度b-a小于或等于1e-3时,终止循环。
2. 循环过程中判断如果f((a+b)/2)等于0,则提前终止循环,并输出结果。在循环外边判断如果f((a+b)/2)不等于0,说明在循环体内并没有结果输出,而是由于区间长度过小(小于或等于1e-3)使循环终止,此时要输出(a + b) / 2。
3. 函数的计算,使用x * (x * (a3 * x + a2) + a1) + a0要比a3*x*x*x+a2*x*x+a1*x+a0更好!
因为这道题比较简单,注意事项也已经提前说明,因此直接粘出代码:
按照惯例粘一下AC的结果:
二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。
二分法的步骤为:
检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a, (a+b)/2],令b=(a+b)/2,重复循环;
本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a, b]内的根。
输入格式:
输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。
输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。
输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33
注意事项:
1. 题目中要求精确到小数点后2位,因此要#define或者const一个常量,#define EPS 1e-3或者const double EPS=1e-3。用这个常量判断区间的大小。亦即当(a,b)区间长度b-a小于或等于1e-3时,终止循环。
2. 循环过程中判断如果f((a+b)/2)等于0,则提前终止循环,并输出结果。在循环外边判断如果f((a+b)/2)不等于0,说明在循环体内并没有结果输出,而是由于区间长度过小(小于或等于1e-3)使循环终止,此时要输出(a + b) / 2。
3. 函数的计算,使用x * (x * (a3 * x + a2) + a1) + a0要比a3*x*x*x+a2*x*x+a1*x+a0更好!
因为这道题比较简单,注意事项也已经提前说明,因此直接粘出代码:
#include <iostream> #include <cstdio> #define EPS (1e-3)// 注意事项1 using namespace std; double a3, a2, a1, a0; double func(double x); int main() { double a, b; cin >> a3 >> a2 >> a1 >> a0; cin >> a >> b; double fa = func(a); double fb = func(b); while(b - a > EPS)// 注意事项1 { double mid = (a + b) /2; double fmid = func(mid); if(fmid == 0)// 注意事项2 { printf("%.2lf", mid); break; } if(fa * fmid > 0) { a = mid; fa = func(a); continue; } if(fb * fmid > 0) { b = mid; fb = func(b); continue; } } if(func((a + b )/ 2) != 0) printf("%.2f\n", (a + b) / 2);// 注意事项2 return 0; } double func(double x) { return x * (x * (a3 * x + a2) + a1) + a0;// 注意事项3 }
按照惯例粘一下AC的结果:
![](http://images.cnitblog.com/blog/703960/201412/211420153432123.jpg)
相关文章推荐
- 中国大学MOOC-数据结构基础习题集、03-3、Tree Traversals Again
- 中国大学MOOC-数据结构基础习题集、02-2、一元多项式求导
- 中国大学MOOC-数据结构基础习题集、03-2、List Leaves
- 中国大学MOOC-数据结构基础习题集、06-4、How Long Does It Take
- PAT-中国大学MOOC-陈越、何钦铭-数据结构基础习题集 00-自测4. Have Fun with Numbers (20) 【二星级】
- 中国大学MOOC-数据结构基础习题集、04-2、File Transfer
- 中国大学MOOC-数据结构基础习题集、04-3、Huffman Codes
- 中国大学MOOC-数据结构基础习题集、05-3、六度空间
- 中国大学MOOC-数据结构基础习题集、07-2、Insert or Merge
- 中国大学MOOC-数据结构基础习题集、04-1、Root of AVL Tree
- 中国大学MOOC-数据结构基础习题集、07-2、Insert or Merge
- 中国大学MOOC-数据结构基础习题集、06-2、旅游规划
- 中国大学MOOC-数据结构基础习题集、02-3、求前缀表达式的值
- 中国大学MOOC-数据结构基础习题集、08-1、Talent and Virtue
- 中国大学MOOC-数据结构基础习题集、09-1、Hashing
- 中国大学MOOC-数据结构基础习题集、07-1、排序
- 中国大学MOOC-数据结构基础习题集、05-1、List Components
- 中国大学MOOC-数据结构基础习题集、05-2、Saving James Bond - Easy Version
- 中国大学MOOC-数据结构基础习题集、08-2、The World's Richest
- PAT-中国大学MOOC-陈越、何钦铭-数据结构基础习题集 00-自测5. Shuffling Machine (20) (简单模拟)【二星级】