查找整数

本文详细解析了两个基本算法问题:查找给定整数在数组中的位置及求解一组整数中的最大值及其下标。通过具体代码实现,展示了如何使用C语言进行数组操作和条件判断。

摘要生成于 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.实验代码

#include<stdio.h>
int main(void)
{
int x,flag, i,n;

scanf("%d %d",&n,&x);

int a[n];
flag=0;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
if(a[i]==x){
printf("%d\n",i);
flag=1;
}
}

if(flag==0){
printf("Not Found\n");
}

return 0;

}

2.实验思路

首先先定义x,n和数组a;然后再输入数组,先假设x不在数组中,置flag为0,再使用for语句来查找x,如果(a【i】==x则输出flag==1),如果flag==0则输出notfound。

3.本题调试过程中遇到的问题及解决办法

 

 还没有输入n的情况下定义了啊【n】

4.运行结果接图

7-2 求最大值及其下标 (20 分)

本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。

输入格式:

输入在第一行中给出一个正整数n(1<n10)。第二行输入n个整数,用空格分开。

输出格式:

在一行中输出最大值及最大值的最小下标,中间用一个空格分开。

输入样例:

6
2 8 10 1 9 10

输出样例:

10 2
1.实验代码

#include <stdio.h>
int main (void)
{
int i, index, n;
int a [10];

scanf ("%d",&n);

for (i=0;i<n;i++)
scanf ("%d",&a[i]);
index=0;
for (i=1; i<n;i++)
index=0;
for (i=1;i<n;i++)
if (a[i]>a[index])
index=i;
printf ("%d %d",a[index],index);

return 0;

}

 

2.设计思路
定义i,n,index和数组a,结社a【0】是最大值,即下标为0的元素最大
如果a【i】比假设的最大值还大再假设a【i】是新的最大值,即下标为i的元素最大
最后输出最大值和对应的下标
3)本题调试过程中遇到的问题及解决方案

 

没有对index做出假设,然后大小符号打错了,最后对照着课本打对了。
5.运行结果截图

 


                                                                                                                                                                        

 



转载于:https://www.cnblogs.com/2001guqiu/p/10470235.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、付费专栏及课程。

余额充值