最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言通過(guò)二分查找實(shí)現(xiàn)猜數(shù)字游戲

 更新時(shí)間:2023年02月03日 15:18:00   作者:辭七七  
這篇文章主要為大家詳細(xì)介紹了在C語(yǔ)言中如何通過(guò)二分查找思想編寫(xiě)一個(gè)簡(jiǎn)單的猜數(shù)字游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

二分查找

題目: 在一個(gè)有序數(shù)組中查找具體的某個(gè)數(shù)字n。

首先我們先定義一個(gè)1···10的數(shù)組 ,如果7為我們要查找的數(shù)字,編寫(xiě)代碼如下

#include <stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    //  下標(biāo)          0 1 2 3 4 5 6 7 8 9
    int k = 7;//k是要查找的數(shù)字
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
     //sz為數(shù)組元素個(gè)數(shù)
    int flag = 0;//
    for (i = 0; i < sz; i++)
    {
        if (k == arr[i])
        {
            flag = 1;
            printf("找到了,下標(biāo)是:%d\n", i);
            break;
        }
    }
    if (flag == 0)
        printf("找不到\n");

???????    return 0;
}

但是這個(gè)代碼的效率比較低,需要循環(huán)多次,所以我們需要用一個(gè)效率較高的方法:二分查找又叫 (折半查找)

二分查找的思想

給你一個(gè)有序的序列,取中間元素和目標(biāo)元素進(jìn)行對(duì)比,取其中的一半,丟棄另一半,快速縮小目標(biāo)元素所在的位置。主要思想還是:快速縮小目標(biāo)元素所在的區(qū)間。

二分查找的條件

1.序列必須是有序的,升序或者降序都可以

2. 序列必須是順序存儲(chǔ)元素的,順序存儲(chǔ)元素主要是可以快速的獲取中間元素(可以通過(guò)下標(biāo)來(lái)找到元素)

二分查找的實(shí)現(xiàn)過(guò)程

分析:假設(shè)我們要找的數(shù)字為7,在查找過(guò)程中要用下標(biāo)進(jìn)行查找,此時(shí)我們定義左下標(biāo)為left,右下標(biāo)為right,中間元素下標(biāo)為mid,(left+right)/2=mid。當(dāng)?shù)谝淮尾檎覜](méi)有找到時(shí),從中間下標(biāo)向左或向右縮短查找范圍繼續(xù)查找,直到找到為止。

以數(shù)字7為例:第一次查找(left+right)/2=(0+9)/2=4,下標(biāo)為4找到的數(shù)字為5,此時(shí)并沒(méi)有找到;第二次查找,因?yàn)閿?shù)字5小于數(shù)字7,所以mid+1=left,right不變,向右查找,此時(shí)(left+right)/2=(5+9)/2=7,下標(biāo)為7,找到的數(shù)字為8,并沒(méi)有找到;第三次查找,因?yàn)閿?shù)字8大于數(shù)字7,所以mid-1=right,左下標(biāo)不變,向左查找,此時(shí)(left+right)/2=(5+6)/2=5,下標(biāo)為5,找到的數(shù)字為6,第四次查找,因?yàn)?小于7,所以向右查找,(left+right)/2=(6+6)/2=6,下標(biāo)為6,找到的數(shù)字為7。

代碼舉例

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	// 下標(biāo)       0 1 2 3 4 5 6 7 8 9
	int k = 7;//k是要查找的數(shù)字
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	//折半查找(二分查找),前提是數(shù)組有序
	int left = 0;
	int right = sz - 1;

	int flag = 0;
	while (left<=right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下標(biāo)是:%d\n", mid);
			flag = 1;
			break;
		}
	}
	if (flag == 0)
		printf("找不到\n");

	return 0;
}

如果left是一個(gè)很大的數(shù),right也是一個(gè)很大的數(shù),left+right超出整形能表達(dá)的最大值,數(shù)據(jù)溢出,此時(shí)(left+right)/2所求的就不是最大值了這時(shí)要怎么辦呢?

我們讓多出的部分除以二在平分,如圖所示

代碼修改

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//            0 1 2 3 4 5 6 7 8 9
	int k = 7;//k是要查找的數(shù)字
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	//折半查找(二分查找),前提是數(shù)組有序
	int left = 0;
	int right = sz - 1;

	int flag = 0;
	while (left<=right)
	{
		int mid = left + (right - left) / 2;

		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下標(biāo)是:%d\n", mid);
			flag = 1;
			break;
		}
	}
	if (flag == 0)
		printf("找不到\n");

	return 0;
}

猜數(shù)字游戲

游戲說(shuō)明

1.電腦生成一個(gè)1~100的的隨機(jī)數(shù)

2.猜數(shù)字

猜大了 就告訴你:猜大了

猜小了 就告訴你:猜小了

猜對(duì)了 就告訴你:恭喜你,猜對(duì)了

猜數(shù)字游戲思想

首先要打印一個(gè)菜單,選擇開(kāi)始游戲還是退出游戲

其次,游戲應(yīng)該可以玩完一局之后玩一局,為循環(huán)進(jìn)行,利用循環(huán)語(yǔ)句構(gòu)建框架

代碼實(shí)現(xiàn)

打印菜單

void menu()
{
    printf("*****************************\n");
    printf("*********   1. play  ********\n");
    printf("*********   0. exit  ********\n");
    printf("*****************************\n");
}

打印結(jié)果

打印主函數(shù)

int main()
{
    int input = 0;
    do
    {
        menu();
        printf("請(qǐng)選擇:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("猜數(shù)字\n");
            break;
        case 0:
            printf("退出游戲\n");
            break;
        default:
            printf("選擇錯(cuò)誤\n");
            break;
        }
    } while (input);
    return 0;
}

此時(shí)游戲過(guò)于簡(jiǎn)單,選擇1要開(kāi)始游戲,所以我們定義一個(gè)游戲函數(shù)game()

打印游戲函數(shù)

游戲第一步:生成隨機(jī)數(shù)

rand()函數(shù)為生成隨機(jī)數(shù)函數(shù),頭文件為<stdlib.h>

rand會(huì)返回一個(gè)0~327637之間的數(shù)

使用rand()要搭配srand() 一起使用,srand()是設(shè)置隨機(jī)數(shù)生成器,一般用時(shí)間戳作為時(shí)間的種子,所以使用time函數(shù)來(lái)獲取時(shí)間,然后將time函數(shù)轉(zhuǎn)換為(unsigned)類(lèi)型在傳給srand函數(shù)

void game()
{
    //1. 生成隨機(jī)數(shù)
    int ret = rand() % 100 + 1;//0~99+1-->1~100
    //2. 猜數(shù)字
    int guess = 0;
    while (1)
    {
        printf("請(qǐng)猜數(shù)字:>");
        scanf("%d", &guess);
        if (guess < ret)
        {
            printf("猜小了\n");
        }
        else if (guess > ret)
        {
            printf("猜大了\n");
        }
        else
        {
            printf("恭喜你,猜對(duì)了\n");
            break;
        }
    }
}

整體代碼演示

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void menu()
{
	printf("*****************************\n");
	printf("*********   1. play  *******\n");
	printf("*********   0. exit  ********\n");
	printf("*****************************\n");
}
//
//rand函數(shù)會(huì)返回一個(gè)0~32767之間的隨機(jī)數(shù)
//
//時(shí)間戳

void game()
{
	//1. 生成隨機(jī)數(shù)
	int ret = rand() % 100 + 1;//0~99+1-->1~100
	//2. 猜數(shù)字
	int guess = 0;
	while (1)
	{
		printf("請(qǐng)猜數(shù)字:>");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜對(duì)了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	//設(shè)置了隨機(jī)數(shù)的生成器
	srand((unsigned int)time(NULL));
    //給srand傳一個(gè)時(shí)間戳,是生成的數(shù)字足夠隨機(jī)
	do
	{
		menu();
		printf("請(qǐng)選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("選擇錯(cuò)誤\n");
			break;
		}
	} while (input);
	return 0;
}

游戲效果演示

以上就是C語(yǔ)言通過(guò)二分查找實(shí)現(xiàn)猜數(shù)字游戲的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言猜數(shù)字的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • QT出現(xiàn)沒(méi)有MySQL驅(qū)動(dòng)手動(dòng)編譯詳細(xì)步驟

    QT出現(xiàn)沒(méi)有MySQL驅(qū)動(dòng)手動(dòng)編譯詳細(xì)步驟

    這篇文章主要給大家介紹了關(guān)于QT出現(xiàn)沒(méi)有MySQL驅(qū)動(dòng)手動(dòng)編譯詳細(xì)步驟的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用QT具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-04-04
  • C語(yǔ)言中 “_at()” 特殊地址定位詳解

    C語(yǔ)言中 “_at()” 特殊地址定位詳解

    這篇文章主要介紹了C語(yǔ)言中 “_at()” 特殊地址定位詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語(yǔ)言中new與malloc的區(qū)別詳解

    C語(yǔ)言中new與malloc的區(qū)別詳解

    這篇文章主要介紹了C語(yǔ)言中new與malloc的區(qū)別詳解,new是運(yùn)算符,可以用于動(dòng)態(tài)分配,如果想要撤銷(xiāo)內(nèi)存使用delete,new運(yùn)算符使用的一般格式為new類(lèi)型,用new分配數(shù)組空間時(shí)不能指定初值,需要的朋友可以參考下
    2023-10-10
  • 在C++中自定義宏的簡(jiǎn)單方法

    在C++中自定義宏的簡(jiǎn)單方法

    這篇文章主要介紹了在C++中自定義宏的簡(jiǎn)單方法,作者建議使用類(lèi)似定義函數(shù)一樣的方法來(lái)定義宏,需要的朋友可以參考下
    2015-07-07
  • 淺談C++ 基類(lèi)指針和子類(lèi)指針的相互賦值

    淺談C++ 基類(lèi)指針和子類(lèi)指針的相互賦值

    下面小編就為大家?guī)?lái)一篇淺談C++ 基類(lèi)指針和子類(lèi)指針的相互賦值。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • C語(yǔ)言的預(yù)處理介紹

    C語(yǔ)言的預(yù)處理介紹

    大家好,本篇文章主要講的是C語(yǔ)言的預(yù)處理介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽
    2021-12-12
  • C 語(yǔ)言環(huán)境設(shè)置詳細(xì)講解

    C 語(yǔ)言環(huán)境設(shè)置詳細(xì)講解

    本文主要介紹C 語(yǔ)言環(huán)境設(shè)置,在不同的系統(tǒng)平臺(tái)上,C語(yǔ)言的環(huán)境設(shè)置不同,這里幫大家整理了Liunx, UNIX,Windows 上安裝C語(yǔ)言環(huán)境,有開(kāi)始學(xué)習(xí)C語(yǔ)言的朋友可以參考下
    2016-08-08
  • C++四種case的詳細(xì)介紹小結(jié)

    C++四種case的詳細(xì)介紹小結(jié)

    本文主要介紹了C++四種case的詳細(xì)介紹小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C++ STL 四種智能指針的用法詳解

    C++ STL 四種智能指針的用法詳解

    C++ 標(biāo)準(zhǔn)模板庫(kù) STL(Standard Template Library) 一共給我們提供了四種智能指針:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,今天給大家詳細(xì)介紹這幾種指針的具體用法,需要的朋友參考下吧
    2021-06-06
  • C++讀取NC數(shù)據(jù)的結(jié)果與真實(shí)數(shù)值不一致的解決方法

    C++讀取NC數(shù)據(jù)的結(jié)果與真實(shí)數(shù)值不一致的解決方法

    本文介紹基于C++ 語(yǔ)言的netCDF庫(kù)讀取.nc格式的柵格文件時(shí),代碼讀取到的數(shù)據(jù)與柵格文件的實(shí)際數(shù)據(jù)不一致的解決方法,文中通過(guò)代碼示例和圖文講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03

最新評(píng)論

乐清市| 湾仔区| 成都市| 社旗县| 台南市| 桐城市| 清新县| 株洲市| 衡阳县| 东源县| 霍山县| 齐河县| 长丰县| 海城市| 清原| 涿州市| 观塘区| 梅州市| 齐河县| 怀来县| 花莲市| 砚山县| 雅安市| 禄丰县| 新邵县| 迭部县| 沾化县| 清镇市| 长治市| 永平县| 蒙城县| 桃江县| 策勒县| 东兴市| 泾源县| 新巴尔虎右旗| 南木林县| 合川市| 大石桥市| 惠东县| 康定县|