方法一:(也是最容易理解的)
我们可以想到,如果这个游戏到只剩最后一个人的时候不结束,那么最后的那个人也会被打出去,所以说,最后被打出去的人就是咱们要找的人(并不是废话), 我们要把被踢出去的人与留下的人区分开来,那么a[i]是1代表他留下来了,等于0的话就被踢出去了(i就是第几个人),下面是实现的代码:
#include<stdio.h>
int main()
{
int a[100];
int n;//代表一共有多少人
int i,k = 0;//k代表退出人数的多少
int count = 0;//报的数1,2,3
int last;//最后出圈的号码
printf("请输入人数\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
a[i]=1;//a[i]=0表示在圈外,a[i]=1表示在圈内
}
while(k<n)
{
for(i=0;i<n;i++)
{
if(a[i]==1)//a[i]==0时直接不让他进来,因为他已经被打走了
{
count++;//若在圈内则报号
if(count%3==0)
{
a[i]=0;
k++;
last=i+1;//每一个被打出去的人都会在这里出先,只不过只有最后一个才能保留下来
}
}
}
}
printf("留下来的那个人是%d号",last);
return 0;
}
法二:
#include<stdio.h>
int main()
{
int n;
int a[100],*p;
scanf("%d",&n);
p=a;//a的首元地址
for(int i=0;i<n;i++)
{
*(p+i)=i+1;//和a[i]=i+1一样,代表第几个人
}
int i=0;
int k=0;//报数
int m=0;//记录退出的人数
while(m<n-1)//当退出人数达到n-1个时就不再循环,剩下的那个数就是报数后剩下的
{
if(*(p+i)!=0)//和上个代码一样,如果他等于0,代表他被打出去了
{
k++;
}
if(k==3)//如果报数为3时
{
*(p+i)=0;//开始踢人了
m++;//退出人数加一
k=0;//k重置为0
}
i++;//继续报数
if(i==n)//如果报到最后一个数时,再从头开始依次遍历报数
i=0;
}
for(int i=0;i<n;i++)
{
if(*(p+i)!=0)//查找不是0的数,即为最后剩下的数
printf("剩下的是%d号",*(p+i));
}
return 0;
}
希望我的代码能对你们的理解有帮助,祝你也祝我能实现自己的人生理想