題解:報數(shù)問題(C++描述)

題目相關(guān)

題目描述

有n人圍成一圈届慈,順序排號陵像。從第1個人開始報數(shù)(從1到3報數(shù))呀伙,凡報到3的人退出圈子知举,問最后留下的是原來的第幾號的那位瞬沦。

輸入

初始人數(shù)n

輸出

最后一人的初始編號

分析

? 在讀完題目發(fā)現(xiàn)太伊,這道題目就是需要我們模擬循環(huán)報數(shù)的過程,可以想象一下小時候玩擊鼓傳花時候的情景逛钻。這道題目的難點(diǎn)在于如何判斷某個同學(xué)是不是還在隊伍中僚焦,不是簡單的判斷是否是3的倍數(shù),這種方法曙痘,僅適用于不循環(huán)的報數(shù)芳悲,一旦首尾相連,倍數(shù)的判斷就不太合適了边坤。

構(gòu)造數(shù)組表明學(xué)生的狀態(tài)

? 每個同學(xué)在這道題目中的數(shù)據(jù)信息有兩個名扛,學(xué)號(編號),是否在隊伍中(在/不在)茧痒。如何采用一定的方法肮韧,將這兩者結(jié)合起來則能迅速處理這一問題。此時旺订,我們可以構(gòu)造一個標(biāo)記數(shù)組弄企,將這兩者結(jié)合起來。將數(shù)組的下標(biāo)作為學(xué)生學(xué)號区拳,存儲的內(nèi)容用來表示學(xué)生狀態(tài)拘领。共有兩個狀態(tài),我們可以使用布爾類型(bool)數(shù)組分別用true和false來表示兩種狀態(tài)樱调,也可以使用整數(shù)類型數(shù)組表示對應(yīng)狀態(tài),為了方便從下標(biāo)1開始约素,開辟空間時可開辟人數(shù)+1的空間。

//開辟bool類型數(shù)組stu笆凌,用來表示各個學(xué)生的狀態(tài)
//stu[x] 為true 表示報到了3不在隊伍中圣猎, false 表示還在隊伍中
bool *stu = new bool[n + 1];// n 為學(xué)生人數(shù)

利用取余實(shí)現(xiàn)模擬循環(huán)

? 該題的另一個難點(diǎn)在于怎么進(jìn)行循環(huán)?無論是 從1~3反復(fù)進(jìn)行報數(shù)還是,n個同學(xué)圍成一圈菩颖,都涉及到了這一點(diǎn)样漆。一種方法是判斷,當(dāng)判斷到結(jié)尾時晦闰,將值重新改成開頭放祟。類似下面這樣

if(num==3) num=1;
if(i==n) i=1;

但這么寫有些麻煩,也得需要考慮變化過程對他的影響呻右。這事我們可以考慮另一種方法跪妥,使用取余符號(%)進(jìn)行模擬。

已知%符號的作用是獲取余數(shù)声滥,例如 7%5=2眉撵。當(dāng)能整除時侦香,結(jié)果為0。所以當(dāng)一個數(shù)字%n時纽疟,結(jié)果一定在0~n-1之間罐韩。并且當(dāng)a%b,a<b時,a%b=a污朽。利用這些特性可以寫出這樣的一個式子:x=(x+1)%n ,這樣x能變成x+1散吵;當(dāng)x為n-1時,x會變成0蟆肆,不斷重復(fù)x就能在0n-1之間循環(huán)矾睦。若想在1n之間循環(huán)可以修改成x=x%n+1。

int i = 1;      //學(xué)生的學(xué)號 1~n
while (ren > 1) //循環(huán)報數(shù)炎功,直到剩下一個人
{
    if (stu[i] == false) // 如果在隊伍中
    {
        num = num % 3 + 1; //報數(shù)
        if (num == 3)
        {                  //報到3
            stu[i] = true; //退出隊伍
            ren--;         //在隊伍中的人數(shù)減一
        }
    }

    i = i % n + 1; //下一個學(xué)生的編號
}

枚舉法找出最后剩下的人的編號

最后只剩下最后一人枚冗,必定是這樣的狀態(tài):所有人都是true,只有他是false。那么我們只需要枚舉遍歷下蛇损,找出狀態(tài)為false的即可赁温。

for (int j = 1; j <= n; j++)
{//枚舉學(xué)號1~n的同學(xué)
    if (stu[j] == false)
    {//當(dāng)狀態(tài)為false,則說明j在隊伍中
        cout << j;//輸出編號
        break;//結(jié)束循環(huán)
    }
}

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

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    //n-存儲人數(shù) num-報的數(shù)字 ren-留下的人數(shù)
    int n, num = 0, ren; 
    
    cin >> n;            // 輸入在人數(shù)
    ren = n;             //確定在隊伍中的人數(shù)

    //開辟bool類型數(shù)組stu,用來表示各個學(xué)生的狀態(tài)
    //stu[x] 為true 表示報到了3不在隊伍中州藕, false 表示還在隊伍中
    bool *stu = new bool[n + 1];

    //初始化 stu,使初始值為false
    memset(stu, false, sizeof(bool) * (n + 1));

    int i = 1;      //學(xué)生的學(xué)號 1~n
    while (ren > 1) //循環(huán)報數(shù)束世,直到剩下一個人
    {
        if (stu[i] == false) // 如果在隊伍中
        {
            num = num % 3 + 1; //報數(shù)
            if (num == 3)
            {                  //報到3
                stu[i] = true; //退出隊伍
                ren--;         //在隊伍中的人數(shù)減一
            }
        }

        i = i % n + 1; //下一個學(xué)生的編號
    }

    for (int j = 1; j <= n; j++)
    {//枚舉學(xué)號1~n的同學(xué)
        if (stu[j] == false)
        {//當(dāng)狀態(tài)為false,則說明j在隊伍中
            cout << j;//輸出編號
            break;//結(jié)束循環(huán)
        }
    }

    return 0;
}

做題時,可從全局角度出發(fā)床玻,將題目分解成若干個小問題毁涉,解決后再整合起來。通過本題锈死,可以練習(xí)數(shù)組的構(gòu)造使用以及循環(huán)的處理贫堰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市待牵,隨后出現(xiàn)的幾起案子其屏,更是在濱河造成了極大的恐慌,老刑警劉巖缨该,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偎行,死亡現(xiàn)場離奇詭異,居然都是意外死亡贰拿,警方通過查閱死者的電腦和手機(jī)蛤袒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膨更,“玉大人妙真,你說我怎么就攤上這事〖允兀” “怎么了珍德?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵练般,是天一觀的道長。 經(jīng)常有香客問我锈候,道長薄料,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任晴及,我火速辦了婚禮都办,結(jié)果婚禮上嫡锌,老公的妹妹穿的比我還像新娘虑稼。我一直安慰自己,他們只是感情好势木,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布蛛倦。 她就那樣靜靜地躺著,像睡著了一般啦桌。 火紅的嫁衣襯著肌膚如雪溯壶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天甫男,我揣著相機(jī)與錄音且改,去河邊找鬼。 笑死板驳,一個胖子當(dāng)著我的面吹牛又跛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播若治,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼慨蓝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了端幼?” 一聲冷哼從身側(cè)響起礼烈,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婆跑,沒想到半個月后此熬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滑进,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年犀忱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郊供。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡峡碉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驮审,到底是詐尸還是另有隱情鲫寄,我是刑警寧澤吉执,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站地来,受9級特大地震影響戳玫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜未斑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一咕宿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜡秽,春花似錦府阀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寞蚌,卻和暖如春田巴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挟秤。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工壹哺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艘刚。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓管宵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昔脯。 傳聞我的和親對象是個殘疾皇子啄糙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容