題目:
有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的哪一位?
大概思路:假設有3個人,它們圍成一圈,按照順時針或逆時針給他們排序,從第一個人開始說,凡是報到3的人退出。其余人繼續圍成一個圈子,直到只剩下一個人。
問最后留下來的是哪一位?
package com.zhj.www;import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Test {static int n; //從屏幕輸入固定的人數n;static int[] people; //人的數組;public static void main(String[] args) { System.out.println("請輸入人數n:"); Scanner input=new Scanner(System.in); n=input.nextInt(); people=new int[n]; //開始非3的數設置報數 selectNoThreeToSet(); //打印結果 printResult(); } //開始非3的數設置報數 private static void selectNoThreeToSet() { int notThreeCount=n,num=1; //不是3的個數,用來作為一個跳出循環的條件,當notThreeCount=1時,跳出循環,代表只剩一個了 for(int i=0;;i++) { if(i==n) //檢索不是只遍歷一次數組,需要循環遍歷,當下標i自加到數組最后時,需要從0開始自加 ,多次遍歷i=0; if(people[i]!=3) { //只有不為0的進行賦值 if(num>3) //報號的數,循環123,如果大于3即4,重新從1開始 num=1; people[i]=num; if(num==3) //當只有報數為3時notThreeCount自減 notThreeCount--; num++; //如果一個同學報數成功,下一個需要加1(這里不考慮循環回1) } if(notThreeCount==1) break; } } //打印結果 private static void printResult() { int t=0; for(int i=0;i<n;i++) { System.out.print(people[i]+"\t"); if(people[i]!=3) t=i; } System.out.printf("\n最后剩下的數為原來第%d號的同學\n",t+1); } }
運行結果:
請輸入人數n:
10
3 3 3 2 3 3 3 3 3 3
最后剩下的數為原來第4號的同學。