约瑟夫环问题(改编)
一.问题描述
二.解题思路
此题可以用多种方法,一种是循环链表,一种是简单的数组循环,鉴于初学者对链表掌握不够,我们用数组循环
三.解题代码
#include<stdio.h>
int main()
{
int i,n,j,x,m;
scanf("%d%d",&n,&m);
int a[n];
x=n;
j=0;
for(i=0;i<n;i++)
{
a[i]=i+1;//循环输入编号
}
while(x>1)
{
for(i=0;i<n;i++)
{
if(a[i]!=0)//数组的0代表未出局的人,数组非0代表出局的人,未出局的人需要报数,出局的人不需要报数
{
j++;
}
if(j==m) //代表已经某个人已经报了m这个数,要出局了
{
printf("%d ",a[i]);
a[i]=0;
j=0;//清空j让下一个人开始报数
x--;
}
}
}
for(i=0;i<n;i++)
{
if(a[i]!=0)//输出所有非0人的编号,也就是出局人
{
printf("%d",a[i]);
}
}
return 0;
}