围圈报数游戏c语言

 

题目描述:

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

​
  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值