大家帮忙看看这个C语言.怎么执行

来源:百度知道 编辑:UC知道 时间:2024/05/15 18:00:46
下列程序的执行结果是
main()
{ int i,test,p[17],head;
for(i=0;i<16;i++)
p[i]=i+1;
p[16]=0;
test=0;
while(test!=p[test] )
{ for (i=1;i<3;i++)
{head=test;
test=p[test];
}
p[head]=p[test];
test=p[head];
}
printf(“\n%5d”,test);
}
特别是后半部分,怎么执行都不知道,都不知道有什么作用.求高手解答

此代码原形是是约瑟夫问题——也叫圆圈报数问题,猴子选大王问题: 你到网上搜一下这一类问题吧

具体解释一下 外循环的意思是报完数了最后剩下一个人报数结束
内循环的意思是 报数 然后出队
数据结构比较类似指针,p[i]存放的是编号为i的人的下一个人的编号 当前报数的人的编号是test head是记录前面的人

动态模拟一下 刚开始17个人
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
0报数1 然后test=1 head=0
1报数2 然后test=2 head=1
跳出循环 p[1]=p[test] //p[1]=p[2]=3 相当于编号为2的人出队了 test=3
然后从3继续报数
整体的过程就是17个人围成一圈报数从编号为0的开始报数 报到3的人就退出去 然后继续报数
输出的是最后留下来的那个人

经过手算 出队顺序应该是
2 5 8 11 14 0 4 9 13 1 7 15 6 16 12 3 10
所以最后输出10 不知道答案对不对呢