(二分法)C语言程序

用二分法做C语言程序设计题目自定只要是C语言就可以了怎么写呀高手同志们... 用二分法做C语言程序设计 题目自定 只要是C语言就可以 了 怎么写呀高手同志们 展开
 我来答
刺友互
高粉答主

2019-07-11 · 每个回答都超有意思的
知道答主
回答量:3979
采纳率:100%
帮助的人:72.9万
展开全部

1、打开Python开发工具IDLE,新建‘search.py’。

2、F5运行程序,list1被正确排序,写这个的目的是说明二分法查找必须前提是一个有序的列表,如果一开始无序首先要排序,当数据量大的时候,快速排序是一个很好的选择,再进行二分法查找。

3、用递归的思想,递归就一定有结束条件。

4、if len(li)==1:   #li长度等于1,只比较这个列表元素与要查找到值return li[0]==item。

5、if len(li)==0: #li长度等于0,全部查找结束还是没有这个值  return False。

6、为程序添加main方法。

7、F5运行程序,正确打印出二分法查找结果,False True。

enochwills
2010-08-02 · TA获得超过4793个赞
知道大有可为答主
回答量:2031
采纳率:96%
帮助的人:1643万
展开全部
#include <math.h>
#include <stdio.h>

double fun(double x) { return 2 * x * x * x - 4 * x * x + 3 * x - 6; }

double root(double a, double b, double e)
{
double x1, x2, y1, x, y;
x1 = a; x2 = b;
do {
x = (x1 + x2)/2;
y = fun(x);
y1 = fun(x1);
if( ( y < 0 && y1 < 0) || (y > 0 && y1 > 0) )
x1 = x;
else
x2 = x;
/*end if*/
}while(fabs(y) > e);
return x;
}

int main(void)
{
double x = root(-10.0f, 10.0f, 1e-8);
printf("%f\n", x);
return 0;
}
/*
运行结果:
2.000000
*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
虢湛芳昂蓝
2019-01-22 · TA获得超过3万个赞
知道小有建树答主
回答量:1.1万
采纳率:33%
帮助的人:618万
展开全部
数学方面:
  一般地,对于函数f(x),如果存在实数c,当x=c时,若f(c)=0,那么把x=c叫做函数f(x)的零点。
  解方程即要求f(x)的所有零点。
  假定f(x)在区间(x,y)上连续
  先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],
  现在假设f(a)<0,f(b)>0,a<b
  
①如果f[(a+b)/2]=0,该点就是零点,
  如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2=>a,从①开始继续使用
  中点函数值判断。
  如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b,从①开始继续使用
  中点函数值判断。
  这样就可以不断接近零点。
  通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。
  给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
  1
确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.
  2
求区间(a,b)的中点c.
  3
计算f(c).
  (1)
若f(c)=0,则c就是函数的零点;
  (2)
若f(a)·f(c)<0,则令b=c;
  (3)
若f(c)·f(b)<0,则令a=c.
  (4)
判断是否达到精确度ξ:即若┃a-b┃<ξ,则得到零点近似值a(或b),否则重复2-4.
  由于计算过程的具体运算复杂,但每一步的方式相同,所以可通过编写程序来运算。
  例:(C语言)
  方程式为:f(x)
=
0,示例中f(x)
=
1+x-x^3
  使用示例:
  input
a
b
e:
1
2
1e-5
  solution:
1.32472
  源码如下:
  #include
<stdio.h>
  #include
<stdlib.h>
  #include
<math.h>
  #include
<assert.h>
  double
f(double
x)
  {
  return
1+x-x*x*x;
  }
  int
main()
  {
  double
a
=
0,
b
=
0,
e
=
1e-5;
  printf("input
a
b
e:
");
  scanf("%lf%lf%lf",
&a,
&b,
&e);
  e
=
fabs(e);
  if
(fabs(f(a))
<=
e)
  {
  printf("solution:
%lg\n",
a);
  }
  else
if
(fabs(f(b))
<=
e)
  {
  printf("solution:
%lg\n",
b);
  }
  else
if
(f(a)*f(b)
>
0)
  {
  printf("f(%lg)*f(%lg)
>
0
!
need
<=
0
!\n",
a,
b);
  }
  else
  {
  while
(fabs(b-a)
>
e)
  {
  double
c
=
(a+b)/2.0;
  if
(f(a)*
f
(
c
)
<
0)
  b
=
c;
  else
  a
=
c;
  }
  printf("solution:
%lg\n",
(a+b)/2.0);
  }
  return
0;
  }
  例:C++语言[类C编写].
  |f(x)|<10^-5
f(x)=2x^3-4x^2+3x-6
  #include"iostream"
  #include"stdio.h"
  #include"math.h"
  #define
null
0
  double
fx(double);
//f(x)函数
  void
main()
  {
  double
xa(null),xb(null),xc(null);
  do
  {
  printf("请输入一个范围x0
x1:");
  std::cin>>xa>>xb;
//输入xa
xb的值
  printf("%f
%f",xa,xb);
  }
  while(fx(xa)*fx(xb)>=0);
//判断输入范围内是否包含函数值0
  do
  {
  if(fx((xc=(xa+xb)/2))*fx(xb)<0)
//二分法判断函数值包含0的X取值区间
  {
  xa=xc;
  }
  else
  {
  xb=xc;
  }
  }
  while(fx(xc)>pow(10.0,-5)||fx(xc)<-1*pow(10.0,-5));//判断x根是否在接近函数值0的精确范围内
  printf("\n
得数为:%f",xc);
  }
  double
fx(double
x)
  {
  return(2.0*pow(x,3)-4.0*pow(x,2)+3*x-6.0);
  }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
推荐于2017-11-25
展开全部
数学方面:
  一般地,对于函数f(x),如果存在实数c,当x=c时,若f(c)=0,那么把x=c叫做函数f(x)的零点。
  解方程即要求f(x)的所有零点。
  假定f(x)在区间(x,y)上连续
  先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],
  现在假设f(a)<0,f(b)>0,a<b
   ①如果f[(a+b)/2]=0,该点就是零点,
  如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2=>a,从①开始继续使用
  中点函数值判断。
  如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b,从①开始继续使用
  中点函数值判断。
  这样就可以不断接近零点。
  通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。
  给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
  1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.
  2 求区间(a,b)的中点c.
  3 计算f(c).
  (1) 若f(c)=0,则c就是函数的零点;
  (2) 若f(a)·f(c)<0,则令b=c;
  (3) 若f(c)·f(b)<0,则令a=c.
  (4) 判断是否达到精确度ξ:即若┃a-b┃<ξ,则得到零点近似值a(或b),否则重复2-4.
  由于计算过程的具体运算复杂,但每一步的方式相同,所以可通过编写程序来运算。
  例:(C语言)
  方程式为:f(x) = 0,示例中f(x) = 1+x-x^3
  使用示例:
  input a b e: 1 2 1e-5
  solution: 1.32472
  源码如下:
  #include <stdio.h>
  #include <stdlib.h>
  #include <math.h>
  #include <assert.h>
  double f(double x)
  {
  return 1+x-x*x*x;
  }
  int main()
  {
  double a = 0, b = 0, e = 1e-5;
  printf("input a b e: ");
  scanf("%lf%lf%lf", &a, &b, &e);
  e = fabs(e);
  if (fabs(f(a)) <= e)
  {
  printf("solution: %lg\n", a);
  }
  else if (fabs(f(b)) <= e)
  {
  printf("solution: %lg\n", b);
  }
  else if (f(a)*f(b) > 0)
  {
  printf("f(%lg)*f(%lg) > 0 ! need <= 0 !\n", a, b);
  }
  else
  {
  while (fabs(b-a) > e)
  {
  double c = (a+b)/2.0;
  if (f(a)* f ( c ) < 0)
  b = c;
  else
  a = c;
  }
  printf("solution: %lg\n", (a+b)/2.0);
  }
  return 0;
  }
  例:C++语言[类C编写].
  |f(x)|<10^-5 f(x)=2x^3-4x^2+3x-6
  #include"iostream"
  #include"stdio.h"
  #include"math.h"
  #define null 0
  double fx(double); //f(x)函数
  void main()
  {
  double xa(null),xb(null),xc(null);
  do
  {
  printf("请输入一个范围x0 x1:");
  std::cin>>xa>>xb; //输入xa xb的值
  printf("%f %f",xa,xb);
  }
  while(fx(xa)*fx(xb)>=0); //判断输入范围内是否包含函数值0
  do
  {
  if(fx((xc=(xa+xb)/2))*fx(xb)<0) //二分法判断函数值包含0的X取值区间
  {
  xa=xc;
  }
  else
  {
  xb=xc;
  }
  }
  while(fx(xc)>pow(10.0,-5)||fx(xc)<-1*pow(10.0,-5));//判断x根是否在接近函数值0的精确范围内
  printf("\n 得数为:%f",xc);
  }
  double fx(double x)
  {
  return(2.0*pow(x,3)-4.0*pow(x,2)+3*x-6.0);
  }
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式