题目:假如有50个人列队站成一列。然后第一个人开始报数。依次为1,2,3,4......50。然后报数为3的倍数的人出列。剩下的人重新从1,2,3.....报数,报数为3的倍数的人出列。剩下的人重新报数。依次类推。问题:用java实现最后一个出列的人是原来50人中的第几个人(即第一次报数的数字)
解决方案 »
- final与线程问题!急!!!
- 那位好心人帮帮忙啊,菜鸟问题在线等待!
- qingwei请大侠指点迷经,怎样打jar包啊? 怎样把自己得东西发布在JAVA中?
- matches()与match()的区别是什么?
- 请问各位高手,如何固定java的窗口,不让使用者改变窗口的尺寸???
- 为什么孙子不能直接调用爷爷的构造函数?父亲不是已经继承了爷爷的构造函数吗?
- 关于Socket并发的疑问?(分不够在加,现在分多多:)
- 谁能给我讲讲“JTextPane中设置局部文本(例如关键字)的Color”的工作原理
- 请问在哪里有javax.crypto包下载
- java and c
- java 小小小问题
- 请指教,关于ArrayList的问题????
import java.util.Scanner;
/**
*使用数组实现约瑟夫环问题
*由m个人围成一个首尾相连的圈报数。
*从第一个人开始,从1开始报数,报到n的人出圈,
*剩下的人继续从1开始报数,直到所有的人都出圈为止。
*对于给定的m和n,求出所有人的出圈顺序.
*/
public class RingTest{
public static void main(String[] args){
System.out.println("程序说明如下:");
System.out.println("由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.");
//提示输入总人数
System.out.println("请输入做这个游戏的总人数:");
Scanner sca=new Scanner(System.in);
int m=sca.nextInt();
//提示输入要出圈的数值
System.out.println("请输入要出圈的数值:");
int n=sca.nextInt();
System.out.println("按出圈的次序输出序号:");
//创建有m个值的数组
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){
if(a[i%m]>0){
if(j%n==0){//找到要出圈的人,并把圈中人数减一
System.out.print(a[i%m]+" ");
a[i%m]=-1;
j=1;
i++;
len--;
}else{
i++;
j++;
}
}else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
i++;
}
}
}
}看原文点这里
import java.util.Scanner;
import java.util.Vector;
public class Count3Quit1 {
public static void main(String[] args) {
System.out.println("请输入参加游戏的总人数:");
Scanner sca=new Scanner(System.in);
int n=sca.nextInt();
int[] a = new int[n];
for(int i=0; i<a.length; i++) {
a[i] = 1;
}
int leftCount = a.length;
int countNum = 0;
int index = 0;
while(leftCount != 1) {
if(a[index] == 1) {
countNum ++;
if(countNum == 3) {
countNum = 0;
a[index] = 0;
leftCount --;
}
}
index ++;
if(index == a.length) {
index = 0;
}
}
for(int i=0; i<a.length; i++) {
if(a[i] == 1) {
System.out.println("最后剩下的人是"+i+"号!");
}
}
}
}
public static void main(String[] args){
System.out.println("请输入参加游戏的总人数:");
Scanner sca=new Scanner(System.in);
int m=sca.nextInt(); KidCircle kc=new KidCircle(m);
Kid k=kc.first; // 定义一个小孩对象k为这个圈的第一个人
int countNum=0; //定义一个变量统计数字
while(kc.count>1){
countNum++;
if(countNum==3){
countNum=0;
kc.delete(k);
}
k=k.right;
}
System.out.println("剩下的那个小孩的id号是: "+kc.first.id);
}
}class Kid{
int id; //小孩编号
Kid left,right; //小孩的左右手
public Kid(){
}
}
class KidCircle{
int count=0; //小孩个数
Kid first,last;
KidCircle(int n){
for(int i=0;i<n;i++)
add(); //构造一个方法,把n个小孩构成一个圈
}
void add(){ //往圈里添加小孩
Kid k=new Kid();
k.id=count;
if(count<=0){
first=k;
last=k;
k.left=k;
k.right=k;
}else{
last.right=k;
k.right=first;
k.left=last;
first.left=k;
last=k;
}
count++;
}
void delete(Kid k){ //小孩删除方法
if(count<=0){
return;
}else if(count==1){
first=last=null;
}else{
k.left.right=k.right;
k.right.left=k.left;
if(k==first){
first=k.right;
}else if(k==last){
last=k.left;
}
}
count--;
}
}
import java.util.ArrayList;
import java.util.List;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Test test = new Test();
System.out.println("最后一个出列的人是"+test.getResult(50,3)); }
private int getResult(int n,int m){
List<Integer> list = new ArrayList<Integer>(n);
List<Integer> list2 = new ArrayList<Integer>();
List<Integer> list3 = new ArrayList<Integer>();
for(int i = 1; i <= n; i++){
list.add(i);
}
while(list.size() >= m){
for(int i = 0; i < list.size(); i++){
if((i+1) % m == 0){
list3.add(list.get(i));
list2.add(list.get(i));
}
}
list.removeAll(list2);
} return list3.get(list3.size()-1);
}
}