约瑟夫环_java_数组

package test;
import java.util.Scanner;//键盘输入
/**

public class test{
public static void main(String[] args){

//提示输入总人数
System.out.println("请输入做这个游戏的总人数:");
Scanner sca=new Scanner(System.in);
int m=sca.nextInt();

//提示输入要出圈的数值
System.out.println("请输入要出圈的数值:");
int n=sca.nextInt();
System.out.println("按出圈的次序输出序号:");

//创建有m=6个值的数组
int[] a=new int[m];
//初始长度,以后出圈一个,长度就减一
int len=m;
//给数组赋值
for(int i=0;i<a.length;i++)
a[i]=i+1;

//i为元素下表,j代表当前要报的数
int i=0;
int j=1;
while(len>0){ //len=6 循环6次
if(a[i%m]>0){
if(j%n==0){//找到要出圈的人,并把圈中人数减一 此时的n=3
//System.out.print(i+"dljahjd");
System.out.print(a[i%m]+" ");

a[i%m]=-1;
j=1;
i++;
len--;
}else{
i++;
j++;
}

}else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
i++;
}

}

}

}

时间: 2024-11-08 10:01:06

约瑟夫环_java_数组的相关文章

约瑟夫环的数组实现

1 /*约瑟夫环的实现*/ 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<time.h> 5 6 #define SIZE 10 7 #define STEP 5 8 9 void initArray(int arr[SIZE]); 10 void joseph_1(); 11 void joseph_2(); 12 13 int main() 14 { 15 joseph_2(); 16 return 0; 1

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

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

C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这个游戏:按这样的规则,剩下一个人,游戏就结束,这个人就为赢家.(读者可以试着表达,不认同,直接忽略) 抽象分析 这个人就是一个数据个体,数据结点,数据元素.上面产生的数据结构为:单方向循环的链.可以用链表实现,也可以用数组来实现. 链表到数组的迁移 人(数据元素. 数据结点.数据个体) 结点关系 (

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

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 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]=

约瑟夫环问题的两种实现[链表+数组]

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 以下是使用循环链表和数组的两种实现: 1 #include<iostream> 2 using namespace std; 3 4 struct Node 5 { 6 int data; 7 Node *next; 8 }; 9 void CreateLink

C语言用数组解决约瑟夫环问题

       在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,大家决定宁愿自杀也不要被敌人抓到,于是确定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而约瑟夫和他的朋友并不想死去,那么他应该怎样安排他和他的朋友的位置,才能逃脱这场死亡游戏呢?         用C语言解决约瑟夫环问题的最佳方式是采用循环链表,但使用数组同样也可以解决瑟夫环的问题.采用循环链表的方法,以后详述.本节主

约瑟夫环问题——初步了解+数组实现

约瑟夫环问题--初步了解+数组实现 一开始接触约瑟夫环问题,还是在C语言的书中,具体的题目如下:n个人围坐成一圈,选某个人开始(比如第1个),从1开始报数,沿着顺时针方向数到m的人被淘汰,然后后面一个人继续再从1开始报数,数到m时再淘汰一人.重复上面的过程,输出剩下的最后一个人. 解题思路: Step 1:建立一个长度为n的数组: Step 2:删除的位置编号为i = (i + m -1) % n; 为什么呢?因为第一个人事i = 0,然后 i 增加m-1即可删除另外一个人,把数组想象成一个"环

j使用数组实现约瑟夫环 java

我们首先来看一下约瑟夫环问题: 给定m个人,m个人围成一圈,在给定一个数n,从m个人中的第一个人每第n个人便将其除去,求被最后一个出去的人的编号. 思路: 建立一个长度为m+1的数组,将其的内容初始化为0至m 我们设置变量i与j,i代表数组元素的下表,因为我设置的数组长度为m+1,所以数组下标就为每个人的编号,当i==m的时候,我们将i置为0,让其从头开始便利. 变量j为判断当前元素是否为排列的第n个元素,如果是则将当前下标为i的元素的值置为0,不是的话,i++,j++,每当我们遍历到数值为0的

小朋友学数据结构(1):约瑟夫环的链表解法、数组解法和数学公式解法

约瑟夫环的链表解法.数组解法和数学公式解法 约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66-70年犹太人反抗罗马的起义.约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难.在那里,这些叛乱者表决说"要投降毋宁死".于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的.约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品