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;//k所报的数;j对人数遍历
    //m为标记为0的人数,m=n-1时停止
    while(m < n-1){
        if(*(p+j)!=0){
            k++;
        }
        if(k==3){
            *(p+j)=0;
            k=0;
            m++;
        }
        j++;
        if(j==n){//每次遍历到最后一个人的时候,都要从头开始重新遍历
            j=0;
        }
    }

    while(*p==0) p++;
    printf("最后留下的人的序号为:%d\n",*p);
    return 0;
}

结果:

时间: 2024-08-05 15:24:33

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

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

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

一群人围成一圈从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

有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)    

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

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

<一>问题描述: 有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止. 问此人原来的位置是多少号? <二>问题解决: 1.定义数组记录每个编号的状态(是否被淘汰): 2.在未被淘汰的人中检查是否数到3,若是,淘汰此人: 3.继续此过程至所有人被淘汰: <三>示例代码: 1 /* 2 16.有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 3 凡报到 3的倍数的人离

java有n个人围城一圈,顺序排号,从第一个开始报数(从一到三报数),凡报道三的人退出

import java.util.ArrayList;import java.util.List;import java.util.ListIterator;import java.util.Scanner; public class DequeueNumThree { //数组 public static void MethodArr(){ System.out.println("Please input total people : "); Scanner scanner = ne

用Matlab完成:从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

程序思路: (1)一圈人循环报数,报数报到3的人,将其置为0,表示被淘汰: (2)那么在接下去的循环中,被淘汰的人不参与报数: (3)直到仅有1人没被淘汰,并显示出他之前的编号. 程序实现如下: clear all n=input('Please input the number:') A=zeros(1,n) for i=1:n                                                         %对每个人进行顺序编号     A(i)=iend o

有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)//说明该人已经离开圈子,报数不增加,走向下一人

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