C语言:有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数。
【问题描述】有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子。如此循环,直到留下最后一个人。问留下来的人的编号。
#include<stdio.h>
#define Max 50
void left_num(int *a,int n1,int m1);
int main(void)
{
int n,m;
int a[Max]={0};
printf("Enter n:");//n为总人数
scanf("%d",&n);
printf("Enter m:");//m为所报数
scanf("%d",&m);
left_num(a,n,m);
return 0;
}
void left_num(int *a,int n1,int m1)
{
int *p;//指针P指向形参指针a
int i,count=0,j=0;//i为形参 A为其循环1-n1编号 ,count为报数,j为目前报到第几人
int index,out=0;//index为报到m1的人输出其编号值,out为出去了几个人(直到留下最后一个)
p=a;
for(i=0;i<n1;i++)
{
*(a+i)=i+1;
}
while(out<n1-1)
{
if(*(p+j)!=0)
{
count++;
}
if(count==m1)
{
count=0;
index=*(p+j);
printf("%d ",*(p+j));
*(p+j)=0;
out++;
}
j++;
if(j==5)
j=0;
}
}