约瑟夫环问题(100围坐一圈报数,报3出圈)

100个人编号1-100,围坐一圈,从1号开始进行1,2,3报数,谁报数为3,就离开圈子,剩下的人继续报1,2,3,报数为3的出圈。。。

请写一段程序,计算最后一个留下来的人,他的编号

 1 package com.ycl.test;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 public class Test1 {
 7     public static void main(String[] args) {
 8         int count = 0;
 9         List<Integer> list = new ArrayList<Integer>();
10         for (int i = 1; i <= 100; i++) {
11             list.add(i);
12         }
13         while (list.size() > 0) {
14             for (int i = 0,j = list.size();i<j; i++) {
15                 ++count;
16                 if(count==3){
17                     count=0;
18                     list.remove(i);
19                     --i;
20                     --j;
21                     continue;
22                 }
23             }
24             if(list.size()==1){
25                 System.out.println("Last Number:"+list.get(0));
26                 break;
27             }
28         }
29     }
30 }
时间: 2024-08-06 11:57:33

约瑟夫环问题(100围坐一圈报数,报3出圈)的相关文章

约瑟夫环的C语言数组实现

约瑟夫环问题的具体描述是:设有编号为1,2,--,n的n个(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,才从他的下一个人起重新报数,报到m时停止报数,报m的出圈,--,如此下去,知道剩余1个人为止.当任意给定n和m后,设计算法求n个人出圈的次序. 一开始看到这这个题目就是觉得这是一个环形的,想到了用链表和用指针,然后看题目的要求是使用数组实现.就先暂时放弃用链表的办法,用数组实现之后再用链表来实现. 一开始的思路是: 1.建立一个长度为n的数组. 2.取出位置编号

约瑟夫环问题-Java数组解决

约瑟夫环问题说的是,n个人围成一圈,从第k个人开始沿着一个方向报数,报到第m个人时,第m个人出列,从紧挨着的下一个人(未出列)开始,求整个环中人的出列顺序.下面是我用java实现的解决方法. 1 class JosephLoop 2 { //n为环中人数,m为每次报数的人数,k为报数的起始位置0-n 3 int n,m,k; 4 int[] persons; 5 int[] seq; 6 7 JosephLoop(int n, int k, int m){ 8 this.n = n; 9 thi

【数据结构】1-2 约瑟夫环问题

这里放出两种不同的代码,一个是老师给的(较为复杂),还有一个是自己写的. 自己写的: #include<iostream> using namespace std; struct Node { int data; //数据单元 Node *link; //指向下一个结点 }; class Josephus { private: Node *head, *current; //head是头结点,current指向当前结点 int sum;//存储链表中元素的个数 public: Josephus

poj 3517 And Then There Was One(约瑟夫环问题)

http://poj.org/problem?id=3517 讲解 n个人,编号为1~n,每次数到m的人出圈,最后一个出圈的人的编号. f[1] = 0; for(int i = 2; i <= n; i++) { f[i] = ( f[i-1] + m)%i; } printf("%d\n",f[n]+1); 这里第一次出圈的人的编号是m,然后从0开始数,每次数到k的人出圈,问最后出圈的人的编号. 注意递推顺序 #include <stdio.h> #include

主要的约瑟夫环问题

解说 http://poj.org/problem?id=3517 n个人,编号为1~n.每次从1開始数,数到m的人出圈.最后一个出圈的人的编号. f[1] = 0; for(int i = 2; i <= n; i++) { f[i] = ( f[i-1] + m)%i; } printf("%d\n",f[n]+1); 这里第一次出圈的人的编号是m,然后从1開始数,每次数到k的人出圈,问最后出圈的人的编号. 注意递推顺序 #include <stdio.h> #i

使用循环链表实现约瑟夫环(围圈报数问题)

刚开始学C,碰到经典的围圈报数问题,现先将实现代码附下: #include<stdio.h>#include<stdlib.h> struct LNODE{ //链表定义 int data; struct LNODE *next;};typedef struct LNODE Lnode;typedef struct LNODE *LinkList;struct LNODE *create(int s[]) //创建单项循环链表{ struct LNODE *head=NULL,*p

分别使用结构体和数组实现约瑟夫环(围圈报数问题之二)

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 void main() { int a[81],n,i,counter,num; //counter用来计算,num用来记录退出的人数 printf("please input total the number of person:"); scanf("%d",&n); for(i=0;i<n;i++) //为每个人编号,1~n { a[i]=

约瑟夫环-一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈

一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王.要求编程模拟此过程,输入m.n, 输出最后那个大王的编号(约瑟夫环). function fuhuan($allnum, $ti){ $arr = array(); for($i = 0; $i < $allnum; $i++){ $arr[$i] = $i; } $nums = 1; whi

约瑟夫环 poj 3750 小孩报数问题 模拟

Language: Default 小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10071   Accepted: 4702 Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序. Input 第一行输入小孩的人数N