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


Input:
包含多組數據。

每行表示初始人數n。<n<1000000)< p="">

最后一組是0,不用處理。

 Output: 對每個測試數據輸出最后一人的初始編號

Sample Input:

3
7
0
Sample Output:
2
4
代碼:
1、這是最簡單的版本,但是難以理解
#include<stdio.h>
int main()
{
	int i,n;
	while(scanf("%d",&n)!=EOF)
	{
		if(n==0)break;
		int f=0;
		for(i=2;i<=n;i++)
		{
			f=(f+3)%i;
		}
		printf("%d\n",f+1);
	} 
} 

2、這是簡單易懂的版本

 

#include<stdio.h> 
void main() 
{
	int i,n;
	while(scanf("%d",&n) != EOF)
	{
		if(n==0) break;
		int a[1000],p=0,q=n;
		for(i=0;i<n;i++)
		{
			a[i]=i+1;
		}
		for(i=0;;i++)
		{
			if(i==n)
			  i=0;//當i++一直到n時,肯定有一些沒有被選到,
			  //比如我們輸入8,第一輪是3,6被賦值0,當i=8時,繼續下一輪
			if(a[i]!=0)
			   p++;//我們下面定義的是當循環到三時,就賦值0,所以這邊等0的不考慮在內
			else
			   continue;
			if(p%3==0)//這個就是從0一直加,到三的倍數就賦值為0,從而就達到我們的目的
			{
				a[i]=0;
				q--;//這是共有q=n個數,數到3就少一個數,為判定減到最后一個數准備 
			}
			if(q==1) break;//當剩下最后一個就輸出
		}
		for(i=0;i<n;i++)
		{
			if(a[i] != 0)
			printf("%d\n",a[i]);
		}
}

 

  

 

  

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 有n個人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 有n個人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 有n個人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 報數問題:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 約瑟夫環問題:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 python 實現:題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM