user-0 提问: 这道题 我实在是不会做了 求助..

回复:
user: user-1
content: 引用 18 楼 sec_kill 的回复:[quote=引用 16 楼 u013470052 的回复:] 一个数组就解决了。 我也是用一个数组解决，但是还是会超时间，毕竟数据太大，用%运算后还是超时！[/quote]  不过最终套用约瑟夫环 公式 还是解决了这道题！

user: user-2
content: 正解在此！http://en.wikipedia.org/wiki/Josephus_problem

user: user-1
content: 引用 16 楼 u013470052 的回复:一个数组就解决了。 我也是用一个数组解决，但是还是会超时间，毕竟数据太大，用%运算后还是超时！

user: user-3
content: 引用 13 楼 wantongtang 的回复:用链表实现了一下，但是那个编译器好像不支持链表 编译器不支持链表？何解？

user: user-4
content: 一个数组就解决了。

user: user-5
content: 数字小还行。数字一大根本停不下来~

user: user-6
content: 这是 约瑟夫环 利用数学推理可以使算法简单很多

user: user-7
content: 用链表实现了一下，但是那个编译器好像不支持链表

user: user-8
content: 约瑟夫环的问题而已 http://baike.baidu.com/link?url=A544HRqbAguRUgH8oSzS1DjwgTwEPomINpndFs7loWhJr63BjlnoUdHpvfWhnL_9

user: user-9
content: 引用 10 楼 angel_su 的回复:google josephus problem或者百度一下...谢谢了，我研究下.....

user: user-10
content: google josephus problem或者百度一下...

user: user-9
content: 引用 8 楼 angel_su 的回复:模拟算法，类似暴力求解，百万数自然吃力，只问你最后一人，套约瑟夫问题的公式吧，一下子就得解...  [quote=引用 7 楼 az6161311 的回复:] http://blog.csdn.net/az6161311/article/details/17737085   我也做了一个，不过貌似数值一大就不行了，什么原因啊 ？？？？？？？？？[/quote]      这个套约瑟夫问题的公式是什么啊??没听过，也没学过，你有相关例子之类的吗？？？我下载下来看看...自学一下...    谢谢大大了。

user: user-10
content: 模拟算法，类似暴力求解，百万数自然吃力，只问你最后一人，套约瑟夫问题的公式吧，一下子就得解...  引用 7 楼 az6161311 的回复:http://blog.csdn.net/az6161311/article/details/17737085   我也做了一个，不过貌似数值一大就不行了，什么原因啊 ？？？？？？？？？

user: user-9
content: http://blog.csdn.net/az6161311/article/details/17737085   我也做了一个，不过貌似数值一大就不行了，什么原因啊 ？？？？？？？？？

user: user-11
content: 这个类似的问题我也做过，只是做的时候我使用的是循环链表，不过个人觉得你可以使用循环队列试试，做这样的问题方法真的很多，仅供参考方法

user: user-10
content: 如果只要知道最后一人，网搜索约瑟夫问题，有简单高效算法。上面模拟算法百万数顶不住...

user: user-12
content: 现做的，不容易阿 我，做了半个多小时。测试了一下 感觉还行。仅供参考阿。也望路过的大神批评 指教。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { 		int n=0; 		int x,y,ko; 		puts("输入人的个数 n"); 		scanf("%d",&n); 		getchar(); 		int a[n]; 		int i,j,k; 		int *p; 		int cout; 		int sum1=0,sum2=0; 		p=a; 		for(i=0;i<n;i++) 				a[i] = 1; 		puts("输入x y"); 		scanf("%d %d",&x,&y); 		getchar(); 		i=0; 		cout = 0; 		k=0; 		while(1) { 				//正数 到第 x 个人 退出  				for(i=k;;i++) { 						i=i%n; 						sum1+=a[i];//用于数到第x个人 						if(sum1==x){ 								a[i] = 0; 								printf("第%d个人出圈\n",i); 								break; 						} 				} 				cout++; 				//判断数组中的每个元素的值是否都为0  				if(cout==n) { 						ko=i; 						break; 				} 				//倒数 到第 y 个人  退出 				for(j=(--i);;j--){ 						if(j<0) j = n+j;//消除负数影响 						sum2+=a[j]; 						if(sum2==y){ 								a[j] = 0;//第j个人出圈，将值置为0 								printf("第%d个人出圈\n",j); 						//		printf("%d\n",j); 								break; 						} 				} 				cout++; 				if(cout==n){ 						ko = j; 						break; 				} 				k=j; 				sum1=sum2=0; 		} 		printf("最后出圈的事%d\n",ko+1); 		return 0; }

user: user-13
content: 引用 1 楼 user-14 的回复:比较笨的方法，双向链表实现。会超时的

user: user-2
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-14
content: 比较笨的方法，双向链表实现。