#include<stdio.h>
int main()
{
int s = 0, j = 0, n, m;
printf(" 约瑟夫环问题 \n");
printf(“请 输 入 数 字 的 总 个 数m:”);
scanf("%d", &m);
printf(“每次删除第n个数字,请输入 n:”);
scanf("%d", &n);
int a[m], b[m],i, count = 0;
for(i=0;i<m;i++)
a[i] = 1 ;
//以下都是根据数学分析得出,首先数组全部赋值为1
for(i=0;j!=m;i++)
{
if(i==m) //当i=m时,数组从头开始查找符合要求的数字
i = 0;
if(a[i]!=0&&i!=m)//条件:该数字为1时,s加1
s++; //当s=n时,利用下面的条件输出数字的下标
if(a[i]1&&sn)//满足两个条件,数字为1意味着该数字未被删除
{ //s=n意味着这个数字是应该被删除的数字
a[i] = 0; //被删除的数字全部赋值为0
b[j] = i; //删除的数字全部赋值给数组b
j++;
s = 0; //每次删除数字后s重新赋值为0
}
}
printf(“依次被删除的数字为:\n”,m,n);
for(i=0;i<m;i++)
printf("%d ", b[i]);
return 0;
}
数学思路:开始所有人都为1,被踢除后变为0,不计入以后循环
约瑟夫环(数组解决)大一新生
最新推荐文章于 2024-07-28 20:57:23 发布