约瑟夫问题。

题目:输入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);
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值