int cout1(int n,int m)//当n <=1 时 函数返回0,其余返回1
{
if(n <= 1)
return 0;
int* a = (int*)malloc(4 * n);
for(int i = 0; i < n; ++i)
a[i] = 1; //1为游戏状态,0为出局状态
int j = n; //剩下的人数
int baoshu = 0; //报的号
while (j > 1) //人数大于1,进入循环
{
for(int i = 0;i < n;++i)//循环数组
{
if(a[i] == 1) //如果玩家在游戏状态
{
baoshu++; //报的数+1
if(baoshu == m) //如果报的数 == m
{
baoshu = 0; //报数归0
a[i] = 0; //玩家设置为出局状态
j--; //人数减1
printf("%d号玩家出局\n",i+1);//打印信息
}
}
}
}
for(int i = 0;i < n; ++i)
{
if(a[i] == 1)
printf("%d号玩家胜利\n",i+1);
}
return 1;
}
int main()
{
int n,m;
scanf("%d",&n);
scanf("%d",&m);
if(cout1(n,m) == 0)
printf("人数过少,不能游戏");
system("pause");
}
约瑟夫环问题,给你找了一个数组实现的带注释的代码,看看吧
#include
#include
void Array_kind(int n, int m)
{/////////////////////////////////////////////////////////n个人进行报数,报到m的出列
int *a, i, j, k;
a = (int*)malloc(sizeof(int)*(n+1));//////////////////////////为数组a动态分配内存
for (i = 1; i <= n; i++)
a[i] = i;///////////////////////////////////////////对每个元素进行编号,代表每个人,注意编号从a[1]开始
for (i = n, k = 1; i >= 1; i--)/////////////////////////////////i为数组当前元素总个数
{
k = (k + m - 1) % i;//////////////////////////////////////令k指向要出列的元素
if (k == 0)//////////////////////////////////////////从上式知,当k+m-1=i时才会(k+m-1)%i=0。因为数组是从a[1]开始的,k=0时出列的元素应该是a[i],而不是a[0]。
k = i;
printf("%d ", a[k]);//////////////////////////////输出要出列的元素
for (j = k; j a[j] = a[j + 1];
}
printf("\n");
}
int main()
{
int m, n, i, s;
while (~scanf("%d%d", &m, &n))
{
Array_kind(m, n);
}
return 0;
}