此情无计可消除,才下眉头,却上心头。
#include<stdio.h>
int main(void)
{
int i, j, n, m ;
int t = 0;
int a[10000];
int *p;
p = a;
// 将a数组的首地址赋给p;
printf("输入同学数:");
scanf_s("%d",&n);
for(i = 1; i <= n; i++, p ++)
*p = 1;
// 将p指向的每一个a[i]的值赋1
for (j = 0; j < 3; j ++)
// 因为报出3就离开,即最多循环3*n倍
for(i = 1; i < n ; i++){
if(*p != 0)
t++;
// 如果当*p指向的a[i]不为0,说明当时的a[i]存在值,所以报数,报完之后t++
if(t % 3 == 0){
// 如果报3离开队列,可以等价于当t等于3的倍数时
m = i;
// 因为每次要离开一个人,要记录每一个离开人的位置,最后一个日离开的位置即最后一个m 的值
*p = 0;
// 离开后将p指向的a[i]值归0
}
}
i = m ;
printf("最后留下来的是第%d位同学\n", i );
return 0 ;
}