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


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

解題思路: 從第一個人開始,逐個報數,誰報3就退出,並且重置報數,直到最后一個人后,又重新從第一個人繼續報數,直到最終只剩一個人的時候退出即可。

答案:

#include <stdio.h>
int main()
{
	int people[128], n;
	printf("Please input how many people: ");
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++) {
		people[i] = i + 1; //對每個人順序排號
	}
	int remain = n;
	int num_off = 0;
	int *p = NULL;
	while (remain > 1) {
		p = people;
		while (p != people + n) { // 每次從第一個位置開始,直到最后一個位置,報數是一直遞增的
			if ((*p) != 0) {//若這個位置人還在
				num_off++; //則報數
				if (num_off == 3) {//否則當前的人即將要報的數字是3
					*p = 0;  //則剔除這個人
					num_off = 0; //並且重新開始計數,下邊會++,所以是從1開始報數
					remain--;//剩余人數-1
				}
			}
			p++;
		}
	}
	for (int i = 0; i < n; i++) {
		if (people[i] != 0) {
			printf("Serial number of the remaining person:%d\n", people[i]);
		}
	}

	printf("\n");
	system("pause");
	return 0;
}

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱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的人退出圈子,問最后留下的是原來第幾號的那位。 【轉】約瑟夫環算法---------題目:有n個人圍成一圈,順序排號,從第一個開始報數(從1到3報數),凡報到3的人退出圈子,問最后最后留下的是原來第幾號的那位.
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM