void main()
{
int a[100],p,q,m,n,i,t;
printf("请输入人的数目:n=");
scanf("%d",&n);
printf("请输入要求数到的中止数:m=");//数到m的猴子退出
scanf("%d",&m);
for(i=0;i<n;i++)
a[i]=i+1;
a[n-1]=0;
p=q=n-1;t=0;//t是计数器;
do
{
p=a[p];
t=t+1;
if(t%m==0)
a[q]=a[p];
else
q=p;
} while(p!=a[p]);
printf("人的总数目为:%d \n",n);
printf("数到的最大值为:%d \n",m);
printf("班长是第%d个人",p+1);
}
源程序代码,不过这里有所改变的就是。这里不局限在数到3退出。这个值可以是你随便设的,当然你可以输入m=3
[此贴子已经被作者于2007-10-22 9:18:36编辑过]
----------------解决方案--------------------------------------------------------
用循环单链表很简单实现.
----------------解决方案--------------------------------------------------------
你说得对。这个用循环链表最简单了,不过写这道题目的主要为了介绍那个算法,其实这里就是用数组做了一个链表,不过不大容易好理解。而且不用对淘汰的元素释放空间了,呵呵
----------------解决方案--------------------------------------------------------
用的是环,比我那个简单!!!!!!!
----------------解决方案--------------------------------------------------------
以下是引用风的声音在2007-10-22 9:20:31的发言:
你说得对。这个用循环链表最简单了,不过写这道题目的主要为了介绍那个算法,其实这里就是用数组做了一个链表,不过不大容易好理解。而且不用对淘汰的元素释放空间了,呵呵
错误,其实用数组也一样的做循环.而且又不用删除元素,用到链表太麻烦.
----------------解决方案--------------------------------------------------------
不过用链表特别好理解,根本就没有这么复杂。对于程序的理解来说,链表更让人容易介绍。
这个方法稍微有些饶,不好理解。不是吗??
----------------解决方案--------------------------------------------------------
要是不怕建表这些烦琐的事,那你做链表.
我觉得理解主要是要理解怎么循环的,如果设置标记,把删除的记为0,到时候遇到跳过就行.
当然,效率上肯定会慢.
----------------解决方案--------------------------------------------------------
用一个循环链表做,既简单又明了
----------------解决方案--------------------------------------------------------
LZ出的题目是经典。但是都被大家验证过了的
----------------解决方案--------------------------------------------------------
又是谭版C的课后题啊..
----------------解决方案--------------------------------------------------------