題目描述
有n個人圍成一圈,順序排號,從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位,
題目分析

這便是整體的題目流程,大家圍成一個圈,愉快的報著數,報到3的人直接out,下一個小伙伴再次從一開始報起,直到我們的決賽圈:

在這也是恭喜我們的m+x號同學獲得游戲勝利,可他究竟是誰呢?這也正是我們編程所要解決的目標,
編程解決
做這道題的思路其實也正是我們用代碼來把整個游戲程序表示出來,讓電腦來幫我們依次報數、淘汰、找出決勝者,
接下來是函式原型:
int remind(int n){} //形參n傳入參加此次游戲的總人數,用int回傳值來回傳勝利者編號
為了解決游戲人數由n傳入,存盤大小未定的問題我們需要用到C語言動態分配的知識,來定義一個動態陣列并且給他們依次賦上編號,
而且此題中我們會發現一個關鍵性的變數,那就是各個玩家所報出來的數字,我們用這個數字來淘汰每個報數報到3的玩家,在這里我們將他命名為tag,同時,我們還需要一個變數來記錄淘汰玩家的個數,當淘汰個數到達n-1的時候游戲結束,勝利者也就誕生了,于是我將這個變數命名為out,
int* circle = (int*)malloc(n * sizeof(int)); //生成動態陣列來對應每位玩家的狀態
int tag = 1; //當前報數號
int out = 0; //游戲淘汰人數
for (int i = 1; i <= n; i++) //為每一位游戲成員掛上編號
circle[i - 1] = i;
同時,我們需要一個回圈來不斷地進行報數操作,并且完成每位成員依次報數與報到3即淘汰的操作,回圈到淘汰玩家到n-1個時退出回圈:
int i = 0; //用于遍歷每一位成員
while (out != n - 1) //回圈到淘汰人數達到n-1人
{
if (circle[i] == -1) //如果該成員已被淘汰則不參與計數
{
if (i == n - 1)
i = 0;
else
i++;
continue;
}
if (tag == 3) //如果報數為3,將此成員淘汰,將淘汰人數加1,并且將報數號重置
{
circle[i] = -1; //淘汰則將此成員編號賦為-1以示淘汰
out++;
tag = 1;
if (i == n - 1)
i = 0;
else
i++;
continue;
}
tag++; //正常(人員未被淘汰參與報數且報數不為3)狀況代碼段
if (i == n - 1)
i = 0;
else
i++;
}
對玩家陣列的操作已經完畢,接下只需確定回傳值內容即可,接下來直接展示完整代碼,
全部代碼
#include<stdlib.h>
int remind(int n)
{
int* circle = (int*)malloc(n * sizeof(int));
int tag = 1;
int out = 0;
for (int i = 1; i <= n; i++) //初始化陣列
circle[i - 1] = i;
int i = 0; //用于遍歷每一位成員
while (out != n - 1)
{
//如果該成員已被淘汰則不參與計數
if (circle[i] == -1)
{
if (i == n - 1)
i = 0;
else
i++;
continue;
}
//如果報數為3,將此成員淘汰,將淘汰人數加1,并且將報數號重置
if (tag == 3)
{
circle[i] = -1;
out++;
tag = 1;
if (i == n - 1)
i = 0;
else
i++;
continue;
}
//正常(人員未被淘汰參與報數且報數不為3)狀況代碼段
tag++;
if (i == n - 1)
i = 0;
else
i++;
}
//確定回傳值
i = 0;
while (circle[i] == -1)
i++;
free(circle);
return i+1;
}
(如有問題,歡迎指正)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/352025.html
標籤:其他
下一篇:記《三言二拍》讀后感
