二分法及其使用案例

1 篇文章 0 订阅


前言

        我们都知道二分法是数学中一种重要的求方程近似根的方法,在生活中也有广泛运用。例如:商场促销活动,会举行猜价格活动。在一定的猜测次数内猜中价格,即把该商品赠送给猜价者。同样,在C语言中,二分法的原理依旧适用。

一、二分法是什么

数学定义:二分法(Bisection method) 即一分为二的方法. 设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点。

典型算法:

算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。

基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较,

如果当前位置arr[k]值等于key,则查找成功;若key小于当前位置值arr[k],则在数列的前半段中查找,arr[low,mid-1];若key大于当前位置值arr[k],则在数列的后半段中继续查找arr[mid+1,high],

直到找到为止  。

二、使用案例

1.找下标

代码如下(示例):

#include<stdio.h>//二分法找下标
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;//最右边的数下标
	int key = 7;
	int mid = 0;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
			break;
	}
	if (left <= right)
		printf("找到了,下标是%d\n", mid);
	else
		printf("找不到\n");
}

结果如下:

2.猜数游戏

代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
	printf("**********************************\n");
	printf("*********** 1.play     **********\n");
	printf("*********** 0.exit     **********\n");
	printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{
	int random_num = rand() % 100 + 1;//生成随机数
	int input = 0;
	while (1)
	{
		printf("请输入猜的数字>:");
		scanf("%d", &input);
		if (input > random_num)
		{
			printf("猜大了\n");
		}
		else if (input < random_num)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("选择错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

结果如下:

 

3、解一元三次方程

方程式为:f(x) = 0,示例中f(x) = 1+x-x^3

代码如下:

#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;
}

若输入1 2 3,结果如下:


 

总结

       以上就是今天要讲的内容,本文简单介绍了二分法的概念及其具体使用案例。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值