前言
我们都知道二分法是数学中一种重要的求方程近似根的方法,在生活中也有广泛运用。例如:商场促销活动,会举行猜价格活动。在一定的猜测次数内猜中价格,即把该商品赠送给猜价者。同样,在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,结果如下:
总结
以上就是今天要讲的内容,本文简单介绍了二分法的概念及其具体使用案例。