论坛首页 Java企业应用论坛

杰哥私房题──约瑟夫问题

浏览 11403 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-04  

问题描述
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号
开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数。就这样,
直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编
号。
输入数据
每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m, n < 300)。最后一行
是:
0 0
输出要求
对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
输入样例:
6 2
12 4
8 3
0 0
输出样例:
5
1
7

#include <stdio.h>
void initialize(char* arg, int n){
	int i;
	for(i = 0; i < n; i ++){
		arg[i] = i + 1;
	}
}
int finalMonkey(char* arg, int n){
	int i;
	for(i = 0; i < n; i++){
		if(arg[i])
			return arg[i];
	}
}

int main(){
	int n, m;
	while(scanf("%d %d", &n, &m) && n != 0 && m != 0){
		char monkeyLoop[300] = {0};
		initialize(monkeyLoop, n);
		int i,j = 0, k = 0, ptr = 0;
		while(1){
			while(j < n){
				if(monkeyLoop[j])
					ptr ++;
				if(ptr == m){
					monkeyLoop[j] = 0;
					ptr = 0;
					k ++;
				}
				j++;
			}
			if (k == n -1){
				break;
			}
			j %= n;
		}
		int result = finalMonkey(monkeyLoop, n);
		printf("%d\n", result);
	}

	return 0;
}
 
   发表时间:2009-03-05   最后修改:2009-03-05
我写了个java代码
import java.util.*;

public class Haha {
	public static void main(String[] args) {
		final int N = 10;
		final int M = 5;
		List<Integer> num = new ArrayList<Integer>();
//		List<Integer> num2 = new ArrayList<Integer>();
		for (int i = 1; i <= N; i++) {
			num.add(i);
		}
		Iterator<Integer> it = num.iterator();
		int ii = 0;
		for (int n = 1;; n++) {
			if (num.size() == 1) {
				System.out.println(num.get(0));
//				num2.add(num.get(0));
				break;
			}
			for (int i = 1; i <= M; i++) {
				if (it.hasNext()) {
					ii = it.next();
				}
				else {
					it = num.iterator();
					ii = it.next();
				}
			}
			System.out.print(ii + "\t");
//			num2.add(ii);
			it.remove();
		}
//		System.out.println(num2);
	}
}
0 请登录后投票
   发表时间:2009-03-05  
ilovemmmm 写道
我写了个java代码
import java.util.*;

public class Haha {
	public static void main(String[] args) {
		final int N = 10;
		final int M = 5;
		List<Integer> num = new ArrayList<Integer>();
//		List<Integer> num2 = new ArrayList<Integer>();
		for (int i = 1; i <= N; i++) {
			num.add(i);
		}
		Iterator<Integer> it = num.iterator();
		int ii = 0;
		for (int n = 1;; n++) {
			if (num.size() == 1) {
				System.out.println(num.get(0));
//				num2.add(num.get(0));
				break;
			}
			for (int i = 1; i <= M; i++) {
				if (it.hasNext()) {
					ii = it.next();
				}
				else {
					it = num.iterator();
					ii = it.next();
				}
			}
			System.out.print(ii + "\t");
//			num2.add(ii);
			it.remove();
		}
//		System.out.println(num2);
	}
}

恩 你这个是用list来写的,以后我也会推出一系列关于链表等的处理程序,希望大家关注
0 请登录后投票
   发表时间:2009-03-05  
来个牛点的:
int findMonkey(int n, int m)
{
    int r = 0;
    for (int i = 2; i <= n; i++)
        r = (r + m) % i;
    return r+1;
}
0 请登录后投票
   发表时间:2009-03-06  
pe1011 写道

来个牛点的:
int findMonkey(int n, int m)
{
&nbsp;&nbsp;&nbsp; int r = 0;
&nbsp;&nbsp;&nbsp; for (int i = 2; i &lt;= n; i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r = (r + m) % i;
&nbsp;&nbsp;&nbsp; return r+1;
}


望ls解答这个是个什么金典算法嘛?确实是对的,受教了。
0 请登录后投票
   发表时间:2009-03-06  
做算法题目不要被java的强大功能限制住了。。。
0 请登录后投票
   发表时间:2009-03-06  
leeldy 写道

做算法题目不要被java的强大功能限制住了。。。

这句话深得我心,我就是因为这个才不用java写算法题,而选择了c,其实我最拿手的也是java,最近试着用C写程序,深深的感觉到了这一点。
0 请登录后投票
   发表时间:2009-03-06  
pe1011 写道
来个牛点的:
int findMonkey(int n, int m)
{
    int r = 0;
    for (int i = 2; i <= n; i++)
        r = (r + m) % i;
    return r+1;
}

我关心的这个到底是啥子算法
0 请登录后投票
   发表时间:2009-03-06  
jiyanliang 写道
pe1011 写道
来个牛点的:
int findMonkey(int n, int m)
{
    int r = 0;
    for (int i = 2; i <= n; i++)
        r = (r + m) % i;
    return r+1;
}

我关心的这个到底是啥子算法

我也很关心 应该是某个大牛想出来的 某个经典算法。
0 请登录后投票
   发表时间:2009-03-17  
写了个JS的版本,随便看看
function findMonkeyKing(n,m)
{
  var a = new Array();
  for(i=0;i<n;i++)
  a.push(i+1);
  while(a.length>1)
  {
    for(i=1;i<m;i++)
      a.push(a.shift());
    a.shift();
  }
  return a.shift();
}
alert(findMonkeyKing(6,2)+"\n"+findMonkeyKing(12,4)+"\n"+findMonkeyKing(8,3));
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics