约瑟夫环问题是循环中的一个经典问题,它有多个版本,我们这次选择最常见的,即被点到出局不再计入循环型。
n个人围成一圈,编号从1-n,第一个人从1数起,数到7的那个人就被淘汰出局,接下来的人又从1数起,数到7再次被淘汰(如果人数不满7个,则循环着数)……最后剩下的一个人就是赢家(主函数已经给出)。
#include<stdio.h>
int jos(int n);
int main()
{
int n,s,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n)
s = jos(n);
printf("%d ", s);
}
return 0;
}
我们需要判断约瑟夫环中的起点问题,有些题目会在淘汰一人时从最开始或他旁边的那个人开始重新计数,而在这个题目中我们只需接着开始就可以了。
下面是我的AC代码:
int jos(int n)
{
int p = 0;
for (int i = 2; i <= n; i++)
{
p = (p + 7) % i;
}
return p + 1;
}
因为不用重新开始,所以代码比较简单,值得注意的是在这类题目中有时结束条件是只剩三个人或两个人,一定要注意分清。