约瑟夫环问题解答思路求助!!
题目:有17个人围成一圈,编号为0—16,从第0号的人开始从1报数,凡报到3的倍数离开圈子,然后再数下去,直到最后只剩下一个人为止,问此人原来的位置是多少号。找到了两种解答方式,第一种比较容易理解,第二种有没有大佬解答一下,非常感谢!!!
第一种:
程序代码:
#include<stdio.h> main() { int a[17] = { 0 };//代表17个人,值为0代表还在,1代表离开 int baoshu = 1;//当前报数的数字,最多49 int total = 17;//当前还剩多少人在 int cur = 0;//17个人的当前人循环到的编号 int i; while (total!=1) { if (cur == 17) //说明已经走到下一圈了,需要保证当前人的编号 cur = 0; if (a[cur] == 1) { //说明该人已经离开圈子,报数不增加,走向下一人判断 cur++; continue; } if (baoshu % 3 == 0) { a[cur] = 1; total -= 1; } baoshu++; cur++; } for (i = 0; i < 17; i++) if(a[i]==0) printf("%d",i); }
第二种:
程序代码:
#include<stdio.h> 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("%d",test); }