C語(yǔ)言算法練習(xí)之佩奇借書(shū)
1. 問(wèn)題描述
佩奇有5本新書(shū),要借給A、B、C這3位小朋友,若每人每次只能借1本,則可以有多少種不同的借法?
2. 題目分析
本題屬于數(shù)學(xué)當(dāng)中常見(jiàn)的排列組合問(wèn)題,即求從 5 個(gè)數(shù)中取 3 個(gè)不同數(shù)的排列組合的總數(shù)。 我們可以將 5 本書(shū)進(jìn)行 1~5 的編號(hào),A、B、C 3個(gè)人每次都可以從 5 本書(shū)中任選 1 本,即每人都有 5 種選擇,由于 1 本書(shū)不可能同時(shí)借給一個(gè)以上的人,因此只要這 3 個(gè)人所選書(shū)的編號(hào)不同,即為一次有效的借閱方法。
3. 算法設(shè)計(jì)
對(duì)于每個(gè)人所選書(shū)號(hào),我們可以采用窮舉循環(huán)來(lái)實(shí)現(xiàn),即從每個(gè)人可選書(shū)號(hào)(1、2、3、4、5)的范圍內(nèi)進(jìn)行窮舉,從而得到可行的結(jié)果。 對(duì)第 1 個(gè)人的選擇,我們可以用循環(huán)將其列出::for (a = 1; a <= 5; a++),同理對(duì)于第 2 個(gè)人、第 3 個(gè)人可以用同樣的方法。 由于一本書(shū)只能借給一個(gè)人,所以第 2 個(gè)人的選擇會(huì)受到第 1 個(gè)人的限制,最后一個(gè)人的選擇會(huì)受到第 2 個(gè)人的限制,即后面的選擇都是在前面選擇的前提下進(jìn)行的,所以可采用循環(huán)的嵌套來(lái)解決問(wèn)題。 利用循環(huán)解決問(wèn)題的時(shí)候,找到循環(huán)的三要素:循環(huán)變量的初值、循環(huán)的控制條件,以及使循環(huán)趨于結(jié)束的循環(huán)變量值的改變是進(jìn)行編程的關(guān)鍵。
4. 代碼實(shí)現(xiàn)
完整代碼??
int main()
{
int a, b, c = 0; //a、b、c分別用來(lái)記錄3個(gè)人所選新書(shū)編號(hào)
int cnt = 0; //用來(lái)統(tǒng)計(jì)借閱的方法
printf("A、B、C 三個(gè)人所選書(shū)號(hào)分別為:↓\n");
for (a = 1; a <= 5; a++) //控制A借書(shū)編號(hào)
{
for (b = 1; b <= 5; b++) //控制B借書(shū)編號(hào)
{
for (c = 1; c <= 5; c++) //控制C借書(shū)編號(hào)
{
if ((a != b) && (a != c) && (c != b)) //控制有效借閱組合
{
printf("A:%d號(hào) B:%d號(hào) C:%d號(hào) | ", a, b, c);
cnt++;
if (cnt % 4 == 0) //打印4列在屏幕上顯示
{
printf("\n");
}
}
}
}
}
printf("總共有%d種有效的借閱方法\n", cnt); //輸出有效的借閱方法總數(shù)
return 0;
}
運(yùn)行結(jié)果??

本題的輸出結(jié)果有一個(gè)條件限制,即 3 個(gè)人所選書(shū)號(hào)各不相同,所以在輸出語(yǔ)句前只要用一個(gè) if 語(yǔ)句 if(a!=b && a!=c && c!=b)判斷即可。

5. 算法升級(jí)
對(duì)于原程序中的第三層 for 循環(huán)來(lái)說(shuō)不管 a、b 的取值是否相同,循環(huán)都要重復(fù)進(jìn)行 5 次。 如果A 和 B 所選書(shū)號(hào)相同,那么無(wú)論 C 選什么書(shū)號(hào)都是無(wú)效的借閱方法。因此在執(zhí)行第 3 個(gè)循環(huán)之前可先行判定A、B 兩人的編號(hào)是否相同,進(jìn)而提高程序效率。

修改后的程序在進(jìn)入循環(huán)體之前首先判斷a、b的取值,如果兩者取值相同,內(nèi)層循環(huán)無(wú)須重復(fù)執(zhí)行5次便可結(jié)束。
完整代碼??

到此這篇關(guān)于C語(yǔ)言算法練習(xí)之佩奇借書(shū)的文章就介紹到這了,更多相關(guān)C語(yǔ)言 佩奇借書(shū)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio 如何創(chuàng)建C/C++項(xiàng)目問(wèn)題
這篇文章主要介紹了Visual Studio 如何創(chuàng)建C/C++項(xiàng)目問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
詳解c/c++鏈?zhǔn)蕉褩C枋鲞M(jìn)制轉(zhuǎn)換問(wèn)題示例
這篇文章主要為大家介紹了c/c++鏈?zhǔn)蕉褩C枋鲞M(jìn)制轉(zhuǎn)換問(wèn)題示例解析有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
C++讀入"N,X,Y,Z"格式文本文件到Eigen3 Matrix
這篇文章主要介紹了C++讀入"N,X,Y,Z"格式文本文件到Eigen3 Matrix,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
基于VC 6.0使用C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊
這篇文章主要為大家詳細(xì)介紹了基于VC 6.0使用C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
C++實(shí)現(xiàn)單鏈表刪除倒數(shù)第k個(gè)節(jié)點(diǎn)的方法
這篇文章主要介紹了C++實(shí)現(xiàn)單鏈表刪除倒數(shù)第k個(gè)節(jié)點(diǎn)的方法,結(jié)合實(shí)例形式分析了C++單鏈表的定義、遍歷及刪除相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
C語(yǔ)言中對(duì)于循環(huán)結(jié)構(gòu)優(yōu)化的一些入門(mén)級(jí)方法簡(jiǎn)介
這篇文章主要介紹了C語(yǔ)言中對(duì)于循環(huán)結(jié)構(gòu)優(yōu)化的一些入門(mén)級(jí)方法,包括算法設(shè)計(jì)的改進(jìn)來(lái)提高一些并行性等方法,要的朋友可以參考下2015-12-12

