反思:
学到了什么?
告诉我用二分法求根的具体方法步骤
反思:
疑惑:
反思:
学到了什么?
告诉我了二分法迭代次数的如何计算通过分析误差限来确认,同时可以确定时间复杂度。
反思:
学到了什么:
首先用二分法之前首先得知道根的位置,如何确定根的位置呢?很简单之间通过把方程问题转化为函数图像交点问题观察交点位置即可
二分法实现程序:
我的答案(自己写的一坨大便)
源代码:
#include<stdio.h>
int main()
{
double left,right,middle;//左指针、右指针、中点值
printf("请输入函数");//一不知道函数怎么选
scanf();
printf("请输入左右端点");
scanf("%d %d");
while(middle<误差值)//这里不知道如何使用误差值
{
middle=(left+right)/2;
if(function(left)*function(middle)<0)
{
middle=right;
}else
{
middle=left;
}//疑问要定义一个
}
return 0;
}
function()//要定义个函数吗
{
}
正确答案:
C语言版:
#include <stdio.h>
// 在有序数组中使用二分法查找指定元素的位置
int binarySearch(int arr[], int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2; // 避免整型溢出
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 没有找到
}
int main() {
int arr[] = {1, 3, 4, 6, 7, 9, 11};
int n = sizeof(arr) / sizeof(int);
int target = 4;
int index = binarySearch(arr, 0, n - 1, target);
if (index == -1) {
printf("没有找到 %d\n", target);
} else {
printf("%d 在数组中的下标为 %d\n", target, index);
}
return 0;
}
C++版:
#include <iostream>
#include <vector>
using namespace std;
int binary_search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
int main() {
vector<int> nums = {1, 3, 5, 7, 9};
int target = 5;
int result = binary_search(nums, target);
if (result != -1) {
cout << "找到目标元素 " << target << ",其下标为 " << result << endl;
} else {
cout << "未找到目标元素 " << target << endl;
}
return 0;
}
解释:
在上述示例中,binarySearch函数使用了迭代的方式来实现二分查找。其中,参数arr表示需要进行查找的有序数组,left表示数组左边界的下标,right表示数组右边界的下标,target表示需要查找的元素。函数首先计算出数组的中间位置mid,然后将其与target进行比较。如果arr[mid]等于
反思:
C和C++的区别
这个C++实现和C语言实现的差别并不大,只是使用了一些C++特有的语法和标准库函数。
以下是这个C++实现和C语言实现的主要差别:
头文件:C++使用<iostream>和<vector>来分别包含输入输出流和向量容器,而C语言使用<stdio.h>和<stdlib.h>来分别包含标准输入输出库和标准库。
命名空间:C++使用命名空间std来避免命名冲突,而C语言没有命名空间的概念。
变量定义和初始化:C++允许在定义变量时进行初始化,而C语言不允许。
向量容器:C++的std::vector是一个可变大小的数组容器,可以动态地添加或删除元素,而C语言需要手动分配内存来实现动态数组。
输出:C++使用std::cout来输出文本,而C语言使用printf函数。
设函数f(x)在区间[a,b]上连续且f(a)f(b)<0,根据连续函数性质,方程f(x)=0在区间(a,b)内至少有一个实根,为便于讨论,不妨假定方程f(x)=0在区间(a,b)内只有一个实根x*,我们可以用下面的方法使有根区间逐步缩小,从而求得满足精度要求的实根x*的近似值.
首先,取a,b的中点将区间分为两半。a十将区间La,6]分为两半•若f(5)=0,则×。就是
〔(t)=0的实根工°;否则检查15)与大a)是否异号,即不等式
16
£④)f(to)<0
北否城这。如感坡立,W1二“此在20左侧,这时段C1三leb三t;香则士“此在动石
3,这时跟a仁的C三c这样就飛到一个新的有根区同La。2了。其长连仅员
la,61的一半
对缩小了的有根区 间Le,6,了,叉可使用同样方法,即用中点t二
a七海
2
〔a,6,了再分为两半,然后判断2是不是根,并用
f(a,f(4)<0
是吞成立划断所求根士’任去,的哪一侧:从而叉确定一个新的有根区间[a,bj
其长度是[a,6.]的一半
如此反复二分下去,进行么次二分后,便得到一组不断缩小的有根区间
[a,6j,[ar,b.J,[c,3,J,,[an,6了,
荷录
其中每个有根区间的长度都是前一有根区间长度的一半,从而[a..b,]的长度为
明E0,-0.-0-a
2
显然,如果二分过程无限继续下去,这些区间最终必收缩于一点¢”,该点就是需
求的根. 因此,若取[as,6]的中点2.=
_aitb作为所求根的近似值,则在二分过程
中可以获得一个近似根序列八些技时)
1x1:20,81,22
XR
该序列以根,‘为极限:
瓶:不过在实际计算时,不可能也没有必要完成这个无限过程,我们的目的只是
求出满足精度要求的近似值• 由于
1t'-t.1-0:-0
b-
2
2647,
(2.2)
故对于任给允许误差,只要二分次数h满足不等式
b-Q三e,
251
则2就是一个满足精度要求的近似根,
本0上述求非线性方程实根近似值的方法
称为二分法.问天
y= sin x
例1 用二分法求方程f(a)=sin s-
-=0
4
的非零实根的近似值,使误差不超过 10-2
解由图2-1可以看出,曲线y=sin x
图2-1曲线 y=sin s与y=公
与y=
4
-除原点外有且只有一个交点,其横坐标介手1.5与2之间。因此,方程只
有一个非零实根x°E[1.5,2].
由2一13≤10-容易确定所需三分次数1-5.因f(1.5)0.5(2)<0,故计算
结果见表2-1. 由上述分析与表2-1知,可取x〝~1.93.
表2-1 用二分法得到的部分计算结果
二分法的优点是方法简单可软,易在计算机上实现,且对两数八(4)的要求
不商,只要连续即可。但是,二分法用于计算精度要求较高的近似根时,所费时间
我长,而且在使用范围上也有局限性,不能用于求复根或偶数重根.
用二分法求方程f(5)=。近似根的程序框图见图?-2.图中a,6分别表示各
有根区间的左、右端点;用于记录二分次数;e18,为允许误差,当1f()1<E或
b-ase,时计算终止.