user-0 提问: 鲁智深吃馒头，这个程序怎么写，一点头绪都没有！

回复:
user: user-1
content: 引用 8 楼 baijiaheizhiganmao 的回复:一个约瑟夫环换个马甲就出来了,骗小盆友呢! 我说的是定义这道题的人,不是贴主.

user: user-1
content: 一个约瑟夫环换个马甲就出来了,骗小盆友呢!

user: user-2
content: 如果C++可以直接list, 或者模拟一个简单的链表, 答案是joseph(100,5) int L[1002],R[1002]; int joseph(int n,int d) {     L[1] =n,L[n]=n-1,R[1]=2,R[n]=1;     for(int i=2;i<n;i++){         L[i] =i-1;         R[i] =i+1;     }     int cur=1;     while(cur!=R[cur]){         for(int i=0;i<d;i++) cur=R[cur];         int prev =L[cur];         R[L[prev]] =cur;         L[cur] =L[prev];     }     return cur; }

user: user-3
content: 好烂，也不知道逻辑对不对  #include <stdio.h>  int main() { 	int a[100] = {0}; 	int i,n,j,k;//i是99个馒头 				//n是代表和尚编号 				//j是指一次跳5个人,若其中k也就是3个人,已经分了，那么n要再加1 				//表示跳过此人 	for(i=0,n=4; i< 99; i++,n=n+5) 	{ 		if(n>=100) 			n=n-100;         	k=3; 		j=n-1; 		while(k--) 		{ 			if(a[j--] == 1) 				n++; 		} 		 		while(a[n] == 1) 		{ 			n++; 			if(n>=100) 			{ 				n=n-100; 			} 		} 		a[n]=1; 	} 	 	for(i=0; i<100; i++) 	{ 		if(a[i] == 0) 			printf("%d\n",i); 	}  }

user: user-4
content: 仅供参考：//假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }

user: user-5
content: 耶稣的叛徒...话说长老包不包括在99个和尚里?

user: user-6
content: 引用 2 楼 user-7 的回复:楼上正解，我就赚个苦劳吧。 #include <stdio.h>  typedef struct _Item{ 	int number; 	struct _Item* next; } Item,*PItem;  void main(){ 	Item items[100]; 	for(int i=0;i<100;i++){ 		items[i].number = i+1;	//按照习惯，编号从1开始 		items[i].next = items + i + 1; 	} 	items[99].next = items;  	Item *current = items; 	int index = 1; 	while(current->next != current){ 		//当前报1，则2、3、4依次传递 		for(int j=0;j<3;j++){ 			current = current->next; 		} 		//下一人吃馒头 		printf("%3d:第%3d个和尚吃馒头\n",index++,current->next->number); 		//下一人退出后，报4的人后面跟着下下一人 		current->next = current->next->next; 		//转下下一人报数1，进入下一循环 		current = current->next; 	}  	printf("\n鲁智深排在第%2d位\n\npress any key to exit...",current->number); 	getchar(); }   不用游标而是指针的静态链表， 好理解又不用动态分配内存。 佩服佩服。

user: user-7
content: 楼上正解，我就赚个苦劳吧。 #include <stdio.h>  typedef struct _Item{ 	int number; 	struct _Item* next; } Item,*PItem;  void main(){ 	Item items[100]; 	for(int i=0;i<100;i++){ 		items[i].number = i+1;	//按照习惯，编号从1开始 		items[i].next = items + i + 1; 	} 	items[99].next = items;  	Item *current = items; 	int index = 1; 	while(current->next != current){ 		//当前报1，则2、3、4依次传递 		for(int j=0;j<3;j++){ 			current = current->next; 		} 		//下一人吃馒头 		printf("%3d:第%3d个和尚吃馒头\n",index++,current->next->number); 		//下一人退出后，报4的人后面跟着下下一人 		current->next = current->next->next; 		//转下下一人报数1，进入下一循环 		current = current->next; 	}  	printf("\n鲁智深排在第%2d位\n\npress any key to exit...",current->number); 	getchar(); }

user: user-6
content: 标准的 Joseph problem 可以用数学方法，也可以用环形队列， 环形队列可以用环形链表实现。 环形链表实现的环形队列最好理解。 这就是那个约瑟夫环的问题