题目:输入n,n为总猴子数,编号为1-n,输入m,从第一个猴子数,数到m的猴子出列,再接着后边从一开始数,知道最后剩下一个猴子,输出猴子编号。
代码:
import java.util.Scanner;
public class yuesefu {
/**
* 约瑟夫问题
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("please input n:(n只猴子)");
int n = scan.nextInt();
System.out.println("please input m:(数到m出列)");
int m = scan.nextInt();
int[] arr = new int[n];
for(int i=0;i<n;i++){
arr[i]= i+1;
}//1
int j = 0,h=0,t = 0;
for(;;h++){
if(arr[h%n]!=0){
j++;
}
if(j==m){
arr[h%n]=0;
j=0;
}
//
for(int h1=0;h1<n;h1++){
if(arr[h1]!=0){
t++;
}
}
if(t==1)break;
t=0;
}//for
for(int k=0;k<n;k++){
if(arr[k]!=0){
System.out.println(arr[k]);
}
}
}
}
使用链表实现约瑟夫:(从1开始数)
代码:
import java.util.Scanner;
public class Demo1{
static class Node{
int val;
Node next;
Node(int v){
val = v;
}
}//定义一个结点
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int sum = scan.nextInt();//总人数
int m = scan.nextInt();//数到m,则其出列
Node t = new Node(1);//头结点
Node x = t;
for(int i=2;i<=sum;i++){
x = (x.next=new Node(i));
}
x.next = t;//最后一个结点指向首结点
System.out.println("出圈顺序:");
while(x!=x.next){
for(int i=1;i<m;i++){
x = x.next;
}
System.out.print(x.next.val+" ");
x.next = x.next.next;
}
System.out.println();
System.out.println("Suv is "+x.val);
}
}
(从n开始数):
代码:
import java.util.Scanner;
public class Demo1{
static class Node{
int val;
Node next;
Node(int v){
val = v;
}
}//定义一个结点
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int sum = scan.nextInt();//总人数
int m = scan.nextInt();//数到m,则其出列
int n = scan.nextInt();
Node t = new Node(1);//头结点
Node x = t;
for(int i=2;i<=sum;i++){
x = (x.next=new Node(i));
}
x.next = t;//最后一个结点指向首结点
for(int i=0;i<n-1;i++){
x=x.next;
}
System.out.println("出圈顺序:");
while(x!=x.next){
for(int i=1;i<m;i++){
x = x.next;
}
System.out.print(x.next.val+" ");
x.next = x.next.next;
}
System.out.println();
System.out.println("Suv is "+x.val);
}
}