int main()
{
int n;
scanf("%d",&n);
int a[100],*p;
p=a;//a的首元地址
for(int i=0;i<n;i++)
{
*(p+i)=i+1;//如:输入5,这时数组里的数值就为[1,2,3,4,5]
}
int j=0;//偏移量
int k=0;//报数
int m=0;//记录退出的人数
while(m<n-1)//当退出人数达到n-1个时就不再循环,剩下的那个数就是报数后剩下的
{
if(*(p+j)!=0)//如果该数不等于0,就往后继续报数
{
k++;
}
if(k==3)//如果报数为3时
{
*(p+j)=0;//将报数折置为0
m++;//退出人数加一
k=0;//k重置为0
}
j++;//继续报数
if(j==n)//如果报到最后一个数时,最后一个数置0并从头开始时宝树
j=0;
}
for(int i=0;i<n;i++)
{
if(*(p+i)!=0)//查找不是0的数,即为最后剩下的数
printf("剩下的是%d号",*(p+i));
}
}
1.定义一个指针p,将其指向数组a的首元地址,即p=a.(这里推荐搞不懂指针的看看b站bite鹏哥的c语言,我也是从那来的)
2.报数人报到3就将其置0并记录退出人数,再继续往下重新报数,报到最后一位就重新回到前面开始遍历,如果等于0就跳到下一个数。
3.while条件记录的是退出人数小于总人数-1的情况,因为报数到最后就会剩下一个人,那么那个人就是我们要找的数啦。
4.最后一步就是遍历该数组,里面不为0的数就将他打印出来。
---------------------------------------------------------------------------------复试顺顺利利,结膜炎快快好起来!