1. 程式人生 > >ACMNO.38 C語言-報數 有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。

ACMNO.38 C語言-報數 有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。

題目描述

有n人圍成一圈,順序排號。
從第1個人開始報數(從1到3報數),凡報到3的人退出圈子。`在這裡插入程式碼片`
問最後留下的是原來的第幾號的那位。

輸入

初始人數n

輸出

最後一人的初始編號

樣例輸入

3

樣例輸出

2

來源/分類

C語言

題目截圖:

在這裡插入圖片描述
思路:

這個程式碼使用比較簡單的方式來解決的。
不使用資料結構裡面的知識。
挺不錯的思想!
quit_num=0;/*出圈人數*/
i=0;k=0;
while(quit_num<n-1)/*直到只剩下1人時*/
{
	if(a[i]!=0)//這個是判斷已經出去過的人!
		k++;//來為K增加資料。
	if(k==3)//當滿足題目中的數到第三個人的時候!進行下面的操作!
	{
		a[i]=0;//模擬這個人被踢出去的操作!
		quit_num++;//這個是判斷結束條件的~
		k=0;//重置判斷條件,就是從0再開始增加。到3的時候,開始剔除人。
	}
i++;//這個是人數的推進!
if(i==n)//這個挺重要的,這個到達最後的時候。代表第一圈迴圈結束啦。到達最後進行的操作!
	i=0;//沒有這個語句的話。就無法進入下一次迴圈!
}

完整程式碼:

#include <iostream>
using namespace std;
int main()
{int a[100000]={0},i,quit_num,k;int n;
cin>>n;
for(i=0;i<n;i++)/*陣列a存放原始編號*/
a[i]=i+1;
quit_num=0;/*出圈人數*/
i=0;k=0;
while(quit_num<n-1)/*直到只剩下1人時*/
{
	if(a[i]!=0)
		k++;
	if(k==3)
	{
		a[i]=0;
		quit_num++;
		k=0;
	}
i++;
if(i==n)
	i=0;
}
for(i=0;i<n;i++)
if(a[i]!=0)
	printf("%d",a[i]);
}

程式碼截圖:
在這裡插入圖片描述
執行結果:
在這裡插入圖片描述
OJ結果:
在這裡插入圖片描述