求解C语言的问题。。编程 难死我了

2025-04-04 12:42:48
推荐回答(2个)
回答1:

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");

}

回答2:

约瑟夫环问题,给你找了一个数组实现的带注释的代码,看看吧

#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;
}