C语言中何为二分法,如何使用
(二分法。
就是将方程的有根取间对分,然后在选择比原区间缩小一半的有根区间,一直这样继续下去,直到得到满足精度要求的根。
二分法计算过程简单,程序容易实现.可在大范围内求根,但该方法收敛较慢,且不能求偶数重根和复根,一般用于求根的。
。
。
)(笔记) SB,我笔记不是借你看过的嘛。
。
。
二分法求平方根 C语言
在给定的区间单调,对应的函数就可以用二分法计算根。
平方根函数符合这个条件,当然可以用二分法求解。
上述程序片段是一段伪代码,<- 表示赋值。
done=1代表根已求出。
a,b代表求根的区间,初始值a=0,b=一个比可能值要大的数,题目中举例说2的16次方,其实只要取x就足够了。
c代表当前假定的根。
do循环就是一个二分的过程,直到done=1或者c=c_old结束。
在实际使用时, if (c*c == x)及 (c != c_old)都应该改成判断两个数的差是否小于给定的误差限,否则实数的相等比较会出现判断错误的。
C语言:用二分法求方程的根,求具体可用程序;
楼主你好~
提供以下代码。
Fedora10下4.3.2编译通过,手动测试通过。
。
#include <stdio.h>
#include <math.h>
#define DEFAULT_UPPER (10)
#define DEFAULT_LOWER (-10)
#define DEFAULT_E (0.00000001)
#define _MID(x,y) ((x+y)/2)
#define _VALUE(x) (2*x*x*x-4*x*x+3*x-6)
double _e;
int getRoot(double lower, double upper, double *result);
main()
{
double root;
printf("Enter a deviation:");
scanf("%lf",& _e);
if(_e == 0.0)
_e = DEFAULT_E;
if(getRoot(DEFAULT_LOWER, DEFAULT_UPPER, &root))
printf("Root:%2.8lf
", root);
else
printf("Root:No Solution.
");
}
int getRoot(double lower, double upper, double *result)
{
*result = _MID(lower,upper);
if(upper - lower <= _e)
return 1;
if(_VALUE(lower)*_VALUE(*result) <= 0)
return getRoot(lower, *result, result);
else if(_VALUE(*result)*_VALUE(upper) <= 0)
return getRoot(*result, upper, result);
else
return 0;
}
很简单的递归。
不过对于楼主的这道题,还要说一点,提示中的二分法求根,只能适用于在给定函数在给定区间中呈单调连续情况下才行得通哦~我也是按照给定的提示来写的上述代码。
如果连续函数在给定区间不单调,很有可能中值*下界值和中值*上界值都大于0,那么会跳出认为没有根,而事实上很有可能这个中值点靠近函数极点。
而真正用二分法求给定区间的思路是:
首先为函数求导,算出导函数的零点,然后再判断零点性质,最后将函数区间分为单调递增和单调递减间隔的形式,对每一段进行二分法求根。
请追问~
谁能用c语言帮我写个二分法的查找程序??
#include<stdlib.h>
void sort(int a[],int n){ /*排序函数,要使用二分法查找就必须对数组进行排序*/
int i,k;
for(i=0;i<n;i++){
int min=i;
for(k=i+1;k<n;k++)
if(a[min]>a[k])min=k;
if(i!=min){
a[min]+=a[i];/*这里是运用加减法交换两个数*/
a[i]=a[min]-a[i];
a[min]-=a[i];
}
}
}
int find(int a[],int n,int key){/*二分法查找;参数:数组名,数组长度,查找关键字*/
int min=0,max=n-1;/*二分法查找头尾变量*/
while(min<max){/*如果最头的变量值大于最尾变量的值,则查找不到,查找失败*/
int cen = (min+max)/2;
if(a[cen]==key) return cen;/*如果查到,则返回关键字在排序数组的下标*/
if(cen==min || cen==max)break;/*如果中间变量等于头尾任一个变量,同样查找失败*/
if(a[cen]>key) max=cen;
else min=cen;
}
return -1;
}
void main(){/*主程序只是为了证明两个函数的可行性,可以自己编写*/
int a[]={14,10,25,36,87,95,10,12,13,8},i;
sort(a,10);
i=find(a,10,11);
if(i!=-1)
printf("be found");
else
printf("no found");
getch();
}
关于二分法查找的一段c语言程序,高手帮看下什么意思,输入是什么输出是什么?
1.利用随机函数产生1000个随机数
for(i=0; i<1000; ++i) { a[i] = rand(); }
//如果要控制1-2000的话,将a[i] = rand();改成a[i] = rand() % 2000;
2.然后调用子函数xuanzhe(),其实就是利用选择排序法,对这1000个数进行升序排序
3.接着输入你要输入查找的数
scanf("%d", &x);
楼主可以在此句前添加几句,这样结构会更加清晰
for (i=0; i<1000; i++)
{
printf("%5d", a[i]);
if ((i + 1) % 10 == 0) //控制换行,每行10个数
{
printf("
");
}
} //将产生1000个随机数每行10个打印出来
printf("请输入所要查找数:");
4.首先线性查找(即一个挨一个查找),看你输入的数在这1000个随机数中出现几次并记录位置
for (i=0; i<1000; ++i)
{
while (x == a[i])
{
printf("找到X=%d, a[%d]
", x, i);
find1 = 1;
break;
}
}
if (find1 == 0)
{
printf("没有你要找的数
");
}
5.接着就是二分法查找
while (!find2 && left < right)
{
mid = (left + right) / 2;
if (x == a[mid])
{
find2=1;
}
else if (x < a[mid])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
if (find2 == 1)
{
printf("找到x=%d ,a[%d]
", x, mid);
}
else
{
printf("没有你要找的数
");
}
其中的 find1 和 find2 主要用于标记(控制输出函数printf),即(标记变量)
此代码主要是比较 《 线性查找》 与 《 折半查找》 的优缺点
如果对你有所帮助,请记得采纳最佳答案,谢谢!