有100个人按编号1-100排成一队,从1开始按1-2-3-1-2-3报数,凡报到3者出列,直至报数到队尾,然后又从队尾的人向队首报数(从1开始报),仍然是报到3者出列,上述过程重复出列,直至队列只剩下2人,求2人的原始编号。
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define LIVE 0
#define DEAD 1
int main()
{
int a[MAX]={LIVE};
int alive = MAX;
int i, j = 1;
bool flag = false;
while(true)
{
for(i = 0; i < MAX; i++)
{
if(a[i] == LIVE)
{
j++;
if(j == 3)
{
a[i] = DEAD;
alive --;
j = 1;
if(alive == 2)
{
flag = true;
break;
}
}
}
}
if(flag) break;
else
{
j = 1;
for(i = MAX - 1; i >=0; i--)
{
if(a[i] == LIVE)
{
j++;
if(j == 3)
{
a[i] = DEAD;
alive --;
j = 0;
if(alive == 2)
{
flag = true;
break;
}
}
}
}
if(flag) break;
}
}
printf("存活下来的人为:");
for(i = 0; i < MAX; i++)
{
if(a[i] == LIVE)
printf(" %d", i);
}
printf("\n");
return 0;
}
把数组当成一个循环表,将出对元素置为-1,同时数组个数减1,周而复始,直到数组个数为2
把数组当成一个循环表,将出对元素置为-1,同时数组个数减1,周而复始,直到数组个数为2