#include <stdio.h>
int main()
{
int i,j,b,c;
int n,a,t;
scanf("%d",&n);
int array[n+1];
int barray[n+1];
for (i = 1;i <= n;i ++)
array[i] = i;
for (j = 1,i = 1;i <= n;i ++){
if(i % 3 != 0)
{barray[j] = array[i];
j ++;}}
t = j - 1;
a = n % 3;
while(1){
for (j = 1,i = 1;j <= t;j ++)
{
if((j+a) % 3 != 0)
{array[i]=barray[j];
i ++;}
}
b = j - 1;
t = i - 1;
if (t == 1)
{
printf("%d",array[t]);
break;
}
a = (a+b) % 3;
for (j = 1,i = 1;i <= t;i++)
{
if((i+a) % 3 != 0)
{barray[j]=array[i];
j ++;}
}
t = j - 1;
c = i - 1;
if (t == 1)
{
printf("%d",barray[t]);
break;
}
a = (c + a) % 3;
}
return 0;
}
对于这种极其复杂的问题就应该先用纸和笔进行复杂的演算
#include<stdio.h>
int main()
{
//先定义一个数组
int array[200];
memset(array,0,sizeof(array));
int n;//n为输入的数字
scanf("%d",&n);
int t,f,s;
t = 0;//t来不断的增加来使数组有个增长的数
f = 0;//f用来ko掉第三个人
s = 0;//最后的一个计数器是来计算总的数字,使它能够在t超出n时重新再来。
do{
t ++;
if(array[t] == 0)f ++;
if(f == 3)
{
array[t] = 1;
f = 0;
s ++;
}
if(t == n)t = 0;
}while(s != n);
printf("%d",t);
return 0;
}
这才是牛逼的,只用了一个数组
用0和1来表示他的生死。