有30个同学围成一个圈,从一到三报数,报到3的退出圆圈,请问最后剩下的是那个同学?并输出出圈同学的顺序。
int main(void)
{
// 围圈报数
int a[100] = {0};
int m , n, t = 0;
int i , j, k = 0;
scanf("%d%d", &m, &n);
for ( i = 1; i <= m; i++)
{
a[i-1] = i;
} //每人附上序号
while ( t < m - 1)
{
for ( j = 0; j < m; j++)
{
if ( a[j]!= 0)
{
k++;
if ( k == n)
{
a[j] = 0;
t++;
k = 0;
}
}
}
}
for ( i = 0; i < m; i++)
{
if ( a[i]!= 0)
{
printf("%d\n", a[i]);
}
}
return 0;
}
找度娘啊!!!
#include
void main()
{
int i,k,m,n,num[50],*p;
printf("input number of person: n=");
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
(p+i)=i+1;
i=0;
k=0;
m=0;
while(m<n-1)//m是指出局的人数,因为有n个人,最后剩下一个人,所以最多出局(n-1)个人,构成循环
{
if((p+i)!=0)//判断这个号(原来的序号)是否出局
k++;//这个号没有出局,就报数,计数器加1
if(k==3)//报3的出局
{
*(p+i)=0;//将出局的这个人标记
k=0;//使计数器置零,以便后面的人报数
m++;//出局人数计数器加1
}
i++;//将指针后移,虽然i不是指针,但p+i就是指针了,所以i就是为指针服务的
if(i==n)//如果指针移到了尾部,则返回到头部
i=0;
}
//以上的循环是主要焦点,后面的就是找出最后那个人,这个好理解
while(*p==0)//用这个可以只判断所找号的前面的号(包括所找号),不用判断后面的。
p++;
printf("The last one is N0.%d\n",*p);
}