请问能把计算过程写边么?难道和我写的不一样么?
人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
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
您对题目的理解是错的。。。
#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 啊~~实在看不懂了~~
#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;
}
#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])
所以我认为程序应该是有问题的