#include<stdio.h>
int main()
{
int people[1000] = { 0 };//赋值为一
int n;
scanf("%d", &n);
int all = n;//all记录现存的人数
int u = -1, i;//u代表编号,因为首项必为第三人(编号u=2),所以此时u=-1,原因看完就懂了
while (1)
{// 一些测试案例...2 2+2=1 1 //1 2 3 4 3 , 2+2=4=0 2 //1 2 3 4 1 2 4
//1 2 3 4 1 2 4 1 4 1// 1 2 3 1 2 2
for (i = 1; i <= 3; i++)//注意i指的是步长,这点也是难我好长时间的一点
{//三个有意义的步使一个人出局
// 研究与这些变量的变化,嘻嘻:printf("\n{u=%d people[u]=%d i=%d\n", u ,people[u],i);
if (people[u] == 0 && i == 3)
{
people[u] = -1;
all--; u++;//下一次开始时从下一个人开始计数
u = u % n;//防止溢出 使u的值限定在0,1 ,2,..,n-1
break;
}
if (people[u] != 0)
i--;//已经出局的人去减少步数
u++;
u = u % n;
}
if (all == 1)//只剩一个人就跳出
break;
}
int m = 0;//利用m,就算编号为0的人存活(第一个人)也能方便的输出
for (int k = 0; k < n; k++)
{
m++;
if (people[k] == 0) printf("%d", m);//遍历所有的人,从编号来检查每个人是否存活
}
return 0;
}
不怎么抽象,就是我总绕晕吧,开始没有考虑步长