12个小朋友手拉手站成一个圆圈,从某一个小朋友开始报数,报到7的那个小朋友退到圈外,然后他的下一位重新报“1”。这样继续下去,直到最后只剩下一个小朋友,求解这个小朋友原来站在什么位置上呢?
#include <stdio.h>
main()
{
int n,i,k,p,x,m;
int a[100];
printf("输入游戏总人数:");
scanf("%d",&n);
printf("输入开始报数人的编号:");
scanf("%d",&k);
printf("退出圈外人的报数点:");
scanf("%d",&m);
for(i=1;i<=n;i++)
a[i]=1; //初始状态表示都在圈内
p=0; //p表示退出圈外的人数
k--;
printf("在圈中的编号:");
for(i=1;i<=n;i++)
if(a[i]=1)
printf("i=%d\t",i);
printf("\n");
printf("出圈次序:");
while(p<n-1)
{
x=0;
while(x<m)
{
k=k+1;
if(k>n)
k=1;
x=x+a[k];
}
printf("%d\t",k);
a[k]=0;
p=p+1;
}
printf("\n");
}
在实验中开辟了12个元素的数组,开始的时候,把这12个元素的数组都赋值为1,这种状态就表示都是一的时候这个人是在圈内的。小朋友报数就用累加数组元素来模拟,累加到7的时候,这个元素所代表的小朋友就退出到圈外去了,并且把对应的下标状态改成0,这样再累加到该元素时他的和就不会发生改变,从而模拟了已经退出圈外的状态。