有n个人围成一圈,顺序从1开始顺序编号。从第一个人开始报数(从1报到3),凡报到3的人退出圈子,问

来源:百度知道 编辑:UC知道 时间:2024/09/28 06:41:12
有n个人围成一圈,顺序从1开始顺序编号。从第一个人开始报数(从1报到3),凡报到3的人退出圈子,问最后留下来的是原来的是第几号。用C语言指针完成编程。

Joseph问题...讲链表的时候都会讲到吧
网上随便搜一下都会有解答的啦XD

#define nmax 50
main()
{
int i,k,m,n,num[nmax],*p;
printf("please input the total of numbers:");
scanf("%d",&n);
p=num;
for(i=0;i<N;I++)
*(p+i)=i+1;
i=0;
k=0;
m=0;
while(m<N-1)
{
if(*(p+i)!=0) k++;
if(k==3)
{ *(p+i)=0;
k=0;
m++;
}
i++;
if(i==n) i=0;
}
while(*p==0) p++;
printf("%d is left\n",*p);
}

此题可用数学方法求解。


设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数  (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)


实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。


假设除去第k个人,则


0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1          // 原始序列 (1)


0, 1, 2, 3, ..., k-2,      , k, ..., n-1        // 除去第k人,即除去序号为k-1的人

2:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子, 有n个人围成一圈,顺序排号。 n个人围成一圈,从第m个人开始顺序报号,凡报到p的人退出圈子,输出依次退出圈子的人来的序号 13个人围成一圈,从第一个人开始顺序报号1、2、3。凡报到3者退出圈子。找出最后留在圈子的人原来的号码 有 N 个人围成一圈参加游戏,游戏的规则是: 设有n个人坐一圈并按顺时针方向从1到n编号, 20. n个人围成一圈,1,2,3循环报数,报到3的人退出 N个人围成一圈,甲乙之间巧有R个人的概率是多少,只考虑甲到乙顺时钟方向. N只猴子围成一圈,从第P个开始,每隔M只报数,打印每次过程,只剩下一个时为大王。 n个人围成一圈和排成一列的排列方法分别怎么计算?