每日一题--二分法找数组中的数

这篇文章发布已经超过两年,部分工具、版本或观点可能已经变化,请结合最新信息判断。

【题目描述】

公司举办年会,为了活跃气氛,设置了摇奖环节。参加聚会的每位员工都有一张带有号码的抽奖券。现在,主持人从小到大依次公布 n 个不同的获奖号码,小唐看着自己抽奖券上的号码 win,无比紧张。

【输入格式】

第一行一个正整数n(2<n≤100),表示有n个获奖号码。

第二行包含n个正整数,之间用一个空格隔开,表示依次公布的n个获奖号码。

第三行一个正整数 win,表示小唐抽奖券上的号码。1≤获奖号码,win<10000。

【输出格式】

一行一个整数,如果小唐中奖了,表示中奖的是第几个号码;如果没有中奖,则为 0。

For example:

Input

Result

7
1 2 3 4 16 27 55
3

3

答案

#include <iostream>

using namespace std;

int main()
{
    int n,i,win,a[100];
    cin >> n;
    
    //输出部分
    for(i=0;i<n;i++)
    {
        cin >> a[i];
    }
    cin >> win;
    int left = 0,right = n-1;   //left存放第一个元素下表,right存放最后一个元素的下标
    int found = n;      //found标记找到的位置,初始化为n,表示没有找到
    
    //二分过程
    while(left <= right)
    {
        int mid = (left + right)/2;
    
        if(a[mid] == win)   //找到了标记位置并退出循环
        {
            found = mid;
            break;
        }
        if(win < a[mid])
        {
            right = mid-1; //win只能在左半部分
        }
        else if(a[mid] < win)
        {
            left = mid+1;
        }
    }
    
    //输出部分
    if(found !=n)
    {
        cout << found + 1 << endl;  //对应的下标加1输出第几个号码
    }
    else
    {
        cout << 0 << endl;
    }
    return 0;
}
  • 注意该案例中数组是从0到n-1定义的,共有n个数
  • 要在编程中考虑到0是第一个数
  • 其实实际编程过程真的不想把0设为第一个数
  • 怪麻烦的
  • 不知道教程为啥要这样写
评论区已延迟加载滑到评论区附近时会自动加载,也可以现在手动打开。