C语言——N个人围成一圈报数淘汰问题

《一》问题描述:

有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数,

凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。

问此人原来的位置是多少号?

《二》问题解决:

1.定义数组记录每个编号的状态(是否被淘汰);

2.在未被淘汰的人中检查是否数到3,若是,淘汰此人;

3.继续此过程至所有人被淘汰;

《三》示例代码:

 1 /*
 2 16.有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数,
 3 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。
 4 问此人原来的位置是多少号?
 5 */
 6
 7 #define _CRT_SECURE_NO_WARNINGS
 8 #include <stdio.h>
 9 #include <stdlib.h>
10
11 void main()
12 {
13     int total = 17, need = 17, k = 3;
14     int index = 0, count = 0, i = 0;
15     int a[100] = { 0 };
16     for (;;)
17     {
18         index = index % total + 1;
19         if (a[index] == 0)
20         {
21             i = (i + 1) % k;
22             if (i == 0)
23             {
24                 count++;
25                 a[index] = 1;
26             }
27         }
28         if (count == need) break;
29     }
30     printf("index = %d\n", index);
31     system("pause");
32 }

时间: 2024-11-08 20:08:49

C语言——N个人围成一圈报数淘汰问题的相关文章

一群人围成一圈从123报数,如果报到3就退出该圈中,直到最后一个人留下来!

package com.pb.demo1; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 一群人围成一圈从123报数,如果报到3就退出该圈中,直到最后一个人留下来! * 约瑟夫的游戏 */ public class Demo1 { public sta

10.5 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位. #include <stdio.h> int main(){ int num[50]; int * p,n,i; p=num; printf("输入人的数目n="); scanf("%d",&n); //为每人赋初始的序号 for(i=0; i<n; i++){ *(p+i)=i+1; } int m=0,j=0,k=0;

java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。

1 /*37 [程序 37 报数] 2 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位. 4 */ 5 6 /*分析1====错误分析,没有注意到要退出圈子!!! 7 * 1.用一个数组存放n个1,从头开始报数 8 * 2.声明一个计数器,报数为3时,数组中的数赋为0,计数器重置 9 * 3.一直直到还剩下最后一个不为0的数,这个数的角标加1就是原来的几号 10 * 11 * 分析2:----利用A

找猴王:15只猴子围成一圈从1报数到7的出局,最后谁是猴王。

第一种: package 找猴王; public class Test { public static void main(String[] args) { int n=15;//15只猴子 int m=7;//数到7的就出局 int count=1;//count为计报数的值,从1开始,7结束 int size=n;//size的值从15变到1,到1时就找到了猴王(每数到7的就出局所以会最终剩余1) int[] a = new int[n];//定义一个数组存放15个猴子的编号(1--15的编

有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号?

void main() { int a[17] = { 0 };//代表17个人,值为0代表还在,1代表离开 int baoshu = 1;//当前报数的数字,最多49 int total = 17;//当前还剩多少人在 int cur = 0;//17个人的当前人循环到的编号 while (total!=1) { if (cur == 17)//说明已经走到下一圈了,需要保证当前人的编号 { cur = 0; } if (a[cur] == 1)//说明该人已经离开圈子,报数不增加,走向下一人

【转】约瑟夫环算法---------题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.

提示:用环形链表实现 对于这个题目其实就是用c语言的循环链表实现一个约瑟夫环.我们可以定义一个循环链表,将这n个人加入到链表中,然后定义三个节点指针在链表上循环,移动跨度为3,利用链表的循环功能每次删除第三个节点,这边要注意的一个问题就是你定义的是3个指针,且在循环中他们彼此也都是有 ->next关系,一般我们判断循环结束条件时都是一个节点的下一个节点是否为它本身(如ptr->next == ptr),这里我们要注意循环体中链接方向否则很可能出现无用指针导致错误,因为最后我们要剩下一个节点那么

有17个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下&#160;的是原来第几号的那位

int n = 17;  boolean[] persons = new boolean[n];  //初始化  for(int i=0;i<persons.length;i++){   persons[i] = true;  }    int len = persons.length;//剩下的人数  int count = 0;  while(len>1){   //继续报数   for(int i=0;i<persons.length;i++){    if(persons[i])

5、题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 思路:n长度的数组,boolean类型。出圈置为false,当最后只有一个true的时候,就是留下来的人。

public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入人的个数n:"); int n = sc.nextInt(); fun(n); sc.close(); } private static void fun(int n) { boolean[] ps = new boolean[n]; int co

有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

#include <iostream> using namespace std; int main() { int i,j,n,m,k,*p,num[100];k=m=0;   cin>>n;      p=num;      for(i=0;i<n;i++)          *(p+i)=i+1;      i=0;      while(m<n-1)      { if(*(p+i)!=0)            k++;         if(k==3)