二分法c语言程序代码(二分法c语言程序代码升序)
求C语言源代码二分法求解非线性方程组的根(VC++6.0)
如果连续函数在给定区间不单调,很有可能中值*下界值和中值*上界值都大于0,那么会跳出认为没有根,而事实上很有可能这个中值点靠近函数极点。而真正用二分法求给定区间的思路是:首先为函数求导,算出导函数的零点,然后再判断零点性质,最后将函数区间分为单调递增和单调递减间隔的形式,对每一段进行二分法求根。
#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\n", root);
else
printf("Root:No Solution.\n");
}
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;
}
谁能用c语言帮我写个二分法的查找程序??
#includestdlib.h
void
sort(int
a[],int
n){
/*排序函数,要使用二分法查找就必须对数组进行排序*/
int
i,k;
for(i=0;in;i++){
int
min=i;
for(k=i+1;kn;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(minmax){/*如果最头的变量值大于最尾变量的值,则查找不到,查找失败*/
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语言中二分法的具体程序是什么呢?
举个例子:
//二分查找法//
#
include
void
main()
{
int
a[16],i,num,flag=0,top,bottom,mid;
//定义一个一维数组a[16]用来存放供查找用的数据,但只用a[1]——a[15]//
//num用来放要查找的数据,flag是表示是否找到的开关变量,top表示查找的起始位置,bottom表示查找的终止位置,mid表示top与bottom的中间位置//
char
goon;
//变量goon为'y'或'Y'时表示继续下一轮查找,否则终止程序//
printf("请输入第1个数字:\n");
scanf("
%d",a[1]);
//依次输入第二到第十五个数,并要求输入的数递减//
for(i=2;i=15;i++)
{
printf("请输入第%d个数字:\n",i);
scanf("
%d",a[i]);
if(a[i]=a[i-1])
{
printf("请再次输入,它应该比上一个数小:\n");
scanf("
%d",a[i]);
}
}
//输出刚才输入的数//
printf("你刚才输入的数是:\n");
for(i=1;i=15;i++)
printf("
%d",a[i]);
printf("\n");
//查找循环开始//
do
{
printf("现在请输入你要查找的数:\n");//输入想要查找的数//
scanf("
%d",num);
top=15;
bottom=1;
mid=15/2+1;
if(numa[1]
||
num
0)//如果在规定的范围内,开始二分法查找//
{
if(num==a[mid])//找到所需数据,退出本层循环//
{
printf("你所要查找的数字是第%d个。\n",mid);
flag=1;
}
else
if(numa[mid])//如果要查找的数据比a[mid]大,在前半数组查找//
{
top=mid+1;
mid=(top+bottom)/2;
}
else
//如果要查找的数据比a[mid]小,在后半数组查找//
{
bottom=mid-1;
mid=(top+bottom)/2;
}
}
if(flag==0)//如果未找到数据,输出找不到的信息//
printf("无法找到你要找的数字!\n");
printf("是否继续查找?(Y/N):\n");//询问是否开始下一轮查找//
scanf("
%c",goon);
}while(goon=='y'
||
goon=='Y');
}
用二分法求方程的根(C语言编写程序)
#include stdio.h
#include math.h
int main() {
double x0, x1, x2, f0, f1, f2;
do {
printf("请输入两个点:");
scanf("%lf,%lf", x1, x2);
f1 = ((2 * x1 - 4) * x1 + 3) * x1 - 6; //换成你自己的 方程
f2 = ((2 * x2 - 4) * x2 + 3) * x2 - 6; //换成你自己的 方程
printf("f1 = %f, f2 = %f\n", f1, f2);
} while (f1 * f2 0);
do {
x0 = (x1 + x2) / 2;
f0 = ((2 * x0 - 4) * x0 + 3) * x0 - 6;
if (f0 * f1 0) {
x2 = x0;
f2 = f0;
}
else {
x1 = x0;
f1 = f0;
}
} while (fabs(f0) = 0.00001);
printf("方程根为:%lf\n", x0);
return 0;
}
求二分法查找演示C语言源代码
二分法查找算法:
1.?主要思想是:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
2. 时间复杂度: ?O(log2n)。
3. C语言源代码(小例子)
search函数即为核心代码:递归查找
#includestdio.h
int?search(int?*a,?int?num,?int?low,?int?high)
{
int?mid?=(low?+?high)/2;
if(low=high)
{
if(num??a[mid])
return?search(a,?num,?low,?mid-1);?//加return
if(num??a[mid])
return?search(a,?num,?mid+1,?high);//加return
if(num==a[mid])?????????????????????
return?1;
}
else
return?0;
}
int?main(){
int?a[11]?=?{0,?1,?2,?3,?4,?5,?9,?11,?12,?13,?15};
if(search(a,?11,?0,?10)==1)
printf("success!!");
else?
printf("failed!!");
}
C语言:二分法
这段代码是求解方程f(x)=0在区间[-10,10]上的根的数值解。
方法的思想就是:一直选取区间中间的数值,如果发现中间的函数值与一侧函数值,异号,那么说明解在这个更小的区间中,采用eps=1e-5作为区间的极限大小,通过迭代的方法求解这个方程的数值解。
所以了解了上述思想,那么else if(f(a)*f(c)0) b=c; 说明的是 f(a)和f(c)异号,那么使用b=(a+b)/2缩小迭代区间,继续迭代;同理else a=c;说明f(a)和f(c)同号,那么使用a(a+b)/2缩小迭代区间,继续迭代!