请问能把计算过程写边么?难道和我写的不一样么?

人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
	    2006-05-15 19:42
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  1 2 4 5  7 
1 2 3 1 2 3 1 2 3  1   2    3   1   2   3   1   2  3 1 2  3 1 
您对题目的理解是错的。。。

	    2006-05-15 19:46
  
	    2006-05-15 19:47
  
	    2006-05-15 19:48
  #include<stdio.h>
void main(void)
{
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);
return;
}
 
可以在外部循环中p[head] = p[test];
下加一个printf("%d",p[test])的变换  但p[test]等于1 后就变成6了 应该是 4 啊~~实在看不懂了~~

	    2006-05-15 21:23
  
	    2006-05-16 19:01
  #include<stdio.h>
void main(void)
{
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]) //当环中元素大于1
{
  for(i = 1; i < 3; i++) //1到3报数
  {
   head = test;    //此处head是
   test = p[test]; //比test“慢一拍”的链表哨兵
  }
  p[head] = p[test]; //删除1个元素
  test = p[head];  //继续“数”下去
}
printf("\n%5d",test);//Josephus问题的胜利者
return;
}

	    2006-05-16 19:22
  
	    2006-05-16 20:56
  #include<stdio.h>
void main(void)
{
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;*/  该句可删                          定义了head但实际上没真正用到haed
   test = p[test];
  }
  /*p[head] = p[test];
  test = p[head];*/     这2句可合并为test= p[test];
}
printf("\n%5d",test);
return;
}
昨天晚上仔细看了下,如果单从程序的角度来说该程序还可以简化,具体看上面红的
所以整个循环就while就变成了让test+3(但当test>=14时另论)
具体为text的值为0,3,6,9,12,15
                           1,4,7,10,13,16
                           2,5,8,11,14 
                           0 ,3,6,9,12,15
                    。。。。。。
我认为test 不可能等于p[test]2者始终差1(除了p[16])
所以我认为程序应该是有问题的      

	    2006-05-17 10:30