查找整数

本文详细解析了在一组整数中查找特定数值的算法实现,包括输入格式、输出格式、实验代码、设计思路以及遇到的错误及其解决办法。通过具体样例展示了查找成功和失败的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7-1 查找整数 (10 分)
本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:
输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:
在一行中输出X的位置,或者“Not Found”。

输入样例1:
5 7
3 5 7 1 9
输出样例1:
2
输入样例2:
5 7
3 5 8 1 9
输出样例2:
Not Found
(1)实验代码
1581766-20190309181533581-1028892461.png

(2)设计思路
1581766-20190302145655156-139241751.png
(3)错误及解决办法
错误1:一些符号漏掉造成编辑错误。
解决办法:运用pta上的提示添加符号。
错误2:定义的数字长度为5,与题意不符合。
解决办法:输入数字运算,发现错误。
1581766-20190302150717320-52977875.png
1581766-20190302150733473-556382705.png
(4)运行如图
1581766-20190302150809416-1483119382.png

转载于:https://www.cnblogs.com/1211li/p/10461174.html

<think>我们参考用户的问题,他想要实现查找整数的功能。根据引用内容,常见的查找算法有顺序查找和二分查找。用户之前的问题是关于从整数序列中找出最小值及其最大下标,但现在的问题是查找整数(可能是查找特定值)。因此,我们需要考虑两种查找算法:顺序查找(线性查找)和二分查找(要求组有序)。用户需求:用C语言实现查找整数的功能。我们可以提供两种方法:1.顺序查找:适用于无序组,时间复杂度为$O(n)$。2.二分查找:适用于有序组,时间复杂度为$O(\logn)$。由于用户有说明组是否有序,我们可以先实现顺序查找,然后实现二分查找,并说明适用条件。另外,引用[3]中提到了二分查找的一个注意事项:计算中间位置时避免整数溢出,应该使用mid=low+(high-low)/2。我们根据引用[1]和引用[2]中的顺序查找代码,以及引用[3]中的二分查找代码,来实现这两个功能。步骤:1.顺序查找:遍历组,找到目标整数则返回其下标,否则返回-1。2.二分查找:要求组有序。通过不断缩小查找范围来定位目标值。注意:顺序查找中,引用[1]提供了两种方法,其中第二种方法使用哨兵,但我们这里使用第一种简单直观的方法。我们将分别编写两个函:-sequentialSearch:顺序查找-binarySearch:二分查找同时,我们提供一个主函来测试,并让用户输入组和要查找整数。注意:用户可能需要查找整数组中第一次出现的位置,或者是任意一次出现的位置。这里我们按照顺序查找会返回第一次出现的位置,而二分查找返回的是任意一个位置(可能有多个相同值,返回其中一个)。如果用户需要特定要求,可以扩展。由于用户之前的示例代码中,顺序查找返回的是最大下标(对于最小值而言),但这里用户要求的是查找整数,我们通常返回第一次出现的下标或者任意一个下标(根据算法而定)。这里我们按照常规:顺序查找返回第一次出现的位置,二分查找返回其中一个位置(不保证是第一个或最后一个)。如果需要返回特定位置,比如第一次出现或最后一次出现,我们需要修改算法(例如,顺序查找时记录第一个或最后一个),但用户当前问题有特别要求,我们先实现基本功能。我们将分别展示两个函的实现,并在主函中根据组是否有序选择不同的查找算法。但是,由于用户有提供组是否有序,我们可以在程序中先判断组是否有序(升序或降序)?这可能会增加复杂度。我们不如让用户自己选择使用哪种查找算法,或者由用户输入组时指定有序性。为了简化,我们在程序中预设组是无序的,所以默认使用顺序查找。如果用户想用二分查找,我们要求组有序(可以提示用户先排序)。另一种做法:我们同时提供两种方法,在主函中给出两种方法的调用示例。我们选择:同时提供两个函,并分别演示。注意:二分查找要求组有序,如果组无序,我们需要先排序(这里不实现排序,只假设组有序)。因此,我们这样设计:1.顺序查找:无论组有序无序都能用。2.二分查找:要求组有序(由调用者保证)。并且,在演示中,我们使用同一个组(在演示二分查找时,我们先对组排序?这样会改变原组,所以我们用另一个有序组来演示二分查找)。为了避免混淆,我们分别用两个组:一个无序组用于顺序查找,一个有序组用于二分查找。具体步骤:1.顺序查找:intsequentialSearch(intarr[],intn,intkey)2.二分查找:intbinarySearch(intarr[],intn,intkey)然后,我们在主函中分别测试。根据引用[3],二分查找注意避免整数溢出:使用mid=low+(high-low)/2。代码实现如下:</think> 以下是使用 C 语言实现整数查找功能的两种常用算法实现及详细解析: ### 1. 顺序查找(线性查找) ```c #include <stdio.h> // 顺序查找 int sequentialSearch(int arr[], int n, int key) { for (int i = 0; i < n; i++) { if (arr[i] == key) { return i; // 找到则返回索引位置 } } return -1; // 未找到返回 -1 } int main() { int arr[] = {5, 2, 8, 2, 1, 3, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); int key = 3; // 要查找的值 int index = sequentialSearch(arr, n, key); if (index == -1) { printf("%d not found in array\n", key); } else { printf("%d found at index %d\n", key, index); } return 0; } ``` **算法特性:** - **时间复杂度**:$O(n)$(最坏情况需遍历整个组) - **空间复杂度**:$O(1)$(只需常空间) - **适用场景**:适用于无序组或小规模据[^1] - **优点**:实现简单,无需预处理 - **缺点**:效率较低,大据集性能不佳 ### 2. 二分查找(折半查找) ```c #include <stdio.h> // 二分查找(要求组已排序) int binarySearch(int arr[], int n, int key) { int low = 0; int high = n - 1; while (low <= high) { // 避免整数溢出的中点计算 int mid = low + (high - low) / 2; if (arr[mid] == key) { return mid; // 找到目标值 } else if (arr[mid] < key) { low = mid + 1; // 目标值在右半区 } else { high = mid - 1; // 目标值在左半区 } } return -1; // 未找到 } int main() { // 有序组 int arr[] = {1, 2, 3, 5, 8, 13, 21, 34}; int n = sizeof(arr) / sizeof(arr[0]); int key = 13; int index = binarySearch(arr, n, key); if (index == -1) { printf("%d not found\n", key); } else { printf("%d found at index %d\n", key, index); } return 0; } ``` **算法特性:** - **时间复杂度**:$O(\log n)$(每次比较缩小一半搜索范围) - **空间复杂度**:$O(1)$ - **适用场景**:适用于大型有序据集[^3] - **前置条件**:组必须已排序 - **优点**:查找效率高 - **缺点**:需要预处理(排序),不适合频繁变动的据集 ### 算法选择建议: 1. 若据**无序且规模小**(n < 100)→ 使用顺序查找 2. 若据**有序或需要多次查询** → 优先选择二分查找 3. 若据**频繁变动** → 顺序查找更合适(避免重复排序开销)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值