C語言每日一練
2021年10月27日
文章目錄
- 題目描述
- 分析
- 代碼實作
- 運行結果
- 網上參考
題目描述
有n個人圍成一圈,順序排號,從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位
分析
可以采用直觀的陣列法,將這些人的編號放入一個陣列,陣列值為0表示淘汰,非0表示在場,一直回圈遍歷陣列,每經過3個在場的陣列值(非0),就將第3個陣列值置0,直到陣列中只剩一個有效值(陣列值非0),此時這個陣列的下標即留下來的成員編號,
代碼實作
#include <stdio.h>
int main()
{
int num = 0; //總人數
int left_num = 0; //當前余下的人數
int i = 0;
int count = 0; //報數 1-3
printf("請輸入人數n\n");
scanf("%d", &num);
left_num = num;
int array[num + 1]; //存放人員的號碼
for(i = 0; i <= num; i++) //0號無效
array[i] = i; //1-num為人員號碼
i = 0;
while(left_num > 1) //余下的人數大于1
{
i++;
if(i > num)
i = 1; //新的一輪 1-num
if(array[i] != 0)
count++; //報數
if(count == 3)
{
array[i] = 0; //報到3的人退出回圈
count = 0; //報數復位,再從1開始
left_num--; //余下人數-1
printf("%d號退出\n", i); //Debug
}
}
for(i = 0; i <= num; i++)
if(array[i] != 0)
printf("最后留下的是%d號\n", i);
return 0;
}
運行結果

網上參考
原文鏈接:https://www.runoob.com/cprogramming/c-exercise-example69.html
思路是一樣的,畢竟這個方法簡單直觀,
// Created by www.runoob.com on 15/11/9.
// Copyright ? 2015年 菜鳥教程. All rights reserved.
//
#include <stdio.h>
void main()
{
int num[50],n,*p,j,loop,i,m,k;
printf("請輸入這一圈人的數量:\n");
scanf("%d",&n);
p=num;
//開始給這些人編號
for (j=0;j<n;j++)
{
*(p+j)=j+1;
}
i=0;//i用于計數,即讓指標后移
m=0;//m記錄退出圈子的人數
k=0;//k報數1,2,3
while(m<n-1)//當退出的人數不大于總人數時,即留下的人數至少是一個人
//這句不能寫成m<n,因為假設有8人,當退出了6人時,此時還是進行人數退出,即m++,
//這時是7<8,剩下的一個人自己喊1,2,3那么他也就退出了,將不會有輸出
{
if (*(p+i)!=0)//如果這個人的頭上編號不是0就開始報數加1,這里采用的方法是報數為3的人頭上編號重置為0
{
k++;
}
if (k==3)
{ k=0; //報數清零,即下一個人從1開始報數
*(p+i)=0;//將報數為3的人編號重置為0
m++; //退出人數加1
}
i++; //指標后移
if (i==n)//這句很關鍵,如果到了隊尾,就要使指標重新指向對頭
//并且它只能放在i++后面,因為只有i++了才有可能i==n
{
i=0;
}
}
printf("現在剩下的人是:");
for (loop=0;loop<n;loop++)
{
if (num[loop]!=0)
{
printf("%2d號\n",num[loop]);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340479.html
標籤:其他
下一篇:前端之Vue配置
