约瑟夫问题有用吗? 怎麽也搞不懂它!!

来源:百度知道 编辑:UC知道 时间:2024/06/06 13:05:26

这个问题主要考察循环和数组的使用,当然很多时候老师是要求用数组和链表两种方式来完成的,没有什么难度,熟悉下最基本的操作和数据结构的~

搞不懂也没什么关系~~我学c++的时候就没有学过约瑟夫问题这个例子~~~

有n个人围成一圈(位置编号1-n),从第1号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止,问此人原来的位置编号是多少号?此即为约瑟夫问题。

下面是谭浩强书上的解答程序,代码较少,比较好理解。我已经加了注释,你可以自己写几个数对着程序的过程操作,很容易理解。
# include "stdlib.h"
# include "stdio.h"
# define nmax 40
main()
{
int i,k,m,n,num[nmax],*p;
printf("\nInput number of people:\n"); /* 输入总人数 */
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1; /* 人的位置编号从1开始到n */
i=0; /* i为扫描一遍计数器,初值置为0,最大值为n,计到n归0再次重计 */
k=0; /* k是计3计数器,记满3个归0重计 */
m=0; /* m表示从圈子中退出的总人数 */
while(m<n-1) /* 当退出的人数为n-1时结束循环,最后的那个没退出的就是所求 */
{
if(*(p+i)!=0) /* 从第一个值不为0的人开始计数 */
k++;
if(k==3)
{
*(p+i)=0; /* 每记满3个将第3个人的值置0,表示该人退出圈子 */
k=0; /* k记满3个归0重计 */
m++; /* 退出圈子人数加1 */
}
i++; /* 一遍循环计数器加1,指向下