题目描述:有n(n<=100)围成一圈,顺序排号(从1排到n)。从第一个人开始报数(从1报到m(m<=9)),凡报到m的人退出圈子,此时报数顺序调转,如:11个人围成1圈,从1报到4时,原来4号位的人退出,此时调转顺序报数,原来3号位的人报数1,原来2号位的人报数2,原来1号位的人报数1,原来11号位的人报数4,此时11号位的人退出游戏,再次逆转顺序报数,以此类推,问最后留下的是原来第几号的那位? |
输入描述:输入为两个正整数,第一个<=100,第二个<=9; |
输出描述:输出为一个正整数; |
样式输入:11 4 |
样式输出:3 |
重要的是逻辑分析,搞清楚 关系
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int fan(int *flag,int index,int incount,int n,int m)
{
int i,count=0;
if(index==1)
{
for(i=incount;;i++)
{
if(i>n)
{
i=i-n; //大于n的时候要从1开始
}
if(flag[i]==1) //表示现在还在场上的人进行游戏
{
count++;
}
if(count==m) //第m个人出局
{
flag[i]=0;
return i;
}
}
}
else if(index==-1)
{
for(i=incount;;i--)
{
if(i<1)
{
i=i+n;
}
if(flag[i]==1)
{
count++;
}
if(count==m)
{
flag[i]=0;
return i;
}
}
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int flag[n+1]; //用来表示是否还在场;
int outpeople[n+1]; //用来计数淘汰的人
int index=1; //表示方向
int i,incount=1;;
for(i=0;i<n+1;i++)
{
flag[i]=1;
outpeople[i]=0;
}
for(i=1;i<=n;i++)
{
incount=fan(flag,index,incount,n,m);
index=-index; //方向变换
outpeople[i]=incount; //计淘汰的人
}
/*for(i=1;i<=n;i++)
{
printf("%d ",outpeople[i]);
}*/
printf("%d",outpeople[n]);
return 0;
}