约瑟夫环是我接触到的最难的一个逻辑的程序,下面我来谈一下我对于这个程序的理解。首先这是一个报数问题,报到3即退出,直到最后一个人。关键在于怎么让人退出。本段程序利用了一个标志1和0,1代表退出,0代表仍然留在圈子里。在退出了一个人之后,总人数会减少一个。接下来的问题就是怎么返回,因为到目前为止我们只能操作一轮,不能形成一个圈。所以到了最后一个人时,我们要加个判断语句:people == i 才可以返回到第一个人继续计数。当只剩一个人的标志是0时即输出。
#include <stdio.h>
int main()
{
int people, i = 0, count = 0, tmp;
char flag[1000] = {0};
printf("please input people :\n");
scanf("%d", &people);
tmp = people;
while(1)
{
i++;
if (flag[i] == 0)
{
count++;
if (3 == count)
{
count = 0;
flag[i] = 1;
tmp--;
if (1 == tmp)
{
break;
}
}
}
if(people == i)
{
i = 0;
}
}
for(i = 1; i <= people; i ++)
{
if(flag[i] == 0 )
{
printf("the last one is %d\n", i);
}
}
return 0;
}