当前位置: 代码迷 >> C语言 >> 这个和序!怪怪!!还望哪位高手赐教
  详细解决方案

这个和序!怪怪!!还望哪位高手赐教

热度:202   发布时间:2004-11-11 13:31:00.0
这个和序!怪怪!!还望哪位高手赐教

有个和序题是这样的:50个学生按1到50序号顺时针围成一个圈,做出局游戏,老师站在最外逆时针从最后一个人数起,每数到5时这人从圈里出来,继续数1,2,3,4,5,数到第5个学生时他就出局,已出局的位置不再参加计数,直至所有的学生出局为止,问最后一个出局的学生序列号是多少? 结果32。 我编了一个程

#include<stdio.h> main() { int i,j,n=0,a[52]; for(i=1;i<=50;i++) a[50-i]=i; a[50]=51; a[51]=52; /*用于检测是否只剩一个人了*/ for(i=0;a[2]!=52;i++) { if(a[i]==51) /*检测是否到了最后一位并跳回*/ i=0; n++; if(n==5) { printf("%d ",a[i]); /*用来查看是否出错,无实义*/ for(j=i;j<51;j++) a[j]=a[j+1]; n=0; } } printf("\n%d\n",a[0]); }

我编的是数到6个就出列没有问题(如程序),可是我把那个改成到第5个出列,就错了。 就是把14行n==5改成n==4;就错得一蹋糊涂。请哪位指教一二。邮箱cxb23@126.com


----------------解决方案--------------------------------------------------------
你指的出错是什么意思????
----------------解决方案--------------------------------------------------------

我所说的出错是运行时按道理只会打印出49+1个数,可是实际上当我将n==5改为n==4,时去打印出来了好几页数据,难道是我的TC有问题?我用的是Turboc2.0的,你们有空就去帮我调试一下吧,要是能把更正后的结果给我贴上来或是发到我邮箱里,那就最好了。谢谢阅读和回贴的人。


----------------解决方案--------------------------------------------------------

这是经典的约瑟夫问题,

我知道的几种方法:循环链表,

标记数组――好象就是楼主的方法,但我一般写标记数组法是把没出局的用1,出局用0这么标记,

建议楼主这么试试,还有跳位可以在没次循环开始时把(i%总数);

数学方法:这个方法比较难想到,对最大报数比较小(目前只研究过对2的情况)的问题适用,

可以大量节约空间和时间,大家不妨看看这个约瑟夫的题,

如果不用数学方法可能就不行了

http://acm.tongji.edu.cn/people/ps/showproblem.php?problem_id=1112

[此贴子已经被作者于2004-11-12 19:06:38编辑过]


----------------解决方案--------------------------------------------------------

用的是循环链表 最直接的一种 仅供参考

# include <stdlib.h>

# define LEN sizeof(struct student) # define STUD 50

struct student { int num ; struct student*next ; } ;

main() { struct student *head = NULL, *p1 = NULL, *p2 = NULL, *p3 = NULL, *p4 = NULL ; int i, j = 0, n = STUD ; for(i=STUD;i>0;i--) { p1=(struct student*)malloc(LEN); p1->num = i ; if(i == STUD) head=p1 ; else p2->next = p1 ; p2 = p1 ; } p2->next = head ; p3 = head ; while(n != 1) { j++; if(j == 5) { p4->next = p3->next ; j = 0 ; n--; } else { p4 = p3 ; } p3 = p3->next ; } printf("%d", p3->num); getch(); }

希望对你在帮助~~~~


----------------解决方案--------------------------------------------------------

4楼的那位所讲的方法我在编完这个和序后也在别的地方看到了,只是觉得自己这个程序错了,不知错在哪里,感觉非常不爽,就来此发贴子。对于5楼的那位朋友编的那个程由于用到结构共同体,我们课本上有但未做要求,暂时还是不太明白,不过放在上些面还是有用的,等我自己看了书以后可以参考一下方法,同时也可以给别感兴趣的同学读一读。对我本人也是一种支持嘛。希望有哪一位还能阅读一下我编的程序,按我的思路(总是会有一点可取的地方的)去考虑一下,最好是能把更正过来的结果给贴上来。谢了!


----------------解决方案--------------------------------------------------------
  相关解决方案