变态杀人狂

来源:互联网 发布:charls数据库 编辑:程序博客网 时间:2024/04/25 12:50

 变态杀人狂

时间限制: 1 Sec  内存限制: 128 MB
提交: 64  解决: 35
[提交][状态][讨论版]

题目描述

变态杀人狂三师弟想到一个杀人游戏
游戏规则如下:
三师弟抓了n个人
对这n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。请输出每次被杀的人的编号
注意最后一个活着的人不用输出

输入

多组测试数据,输入n和m值。1<n,m<200,EOF结束

输出

输出每次被杀的人的编号 注意 最后一个人不用输出

样例输入

5 3

样例输出

3152
解题思路:
题目意思是,M个人数数,数到数字N的人被杀,依次输出除最后一个人外所有被杀人的序号。这是一道模拟题,我们可以开一个一维数组,我们仅适用
一维数组1~n的空间,人杀与没有被杀是两种状态,我们可以用0和1表示,我们用1表示没有被杀,用0表示没有被杀,刚开始我们先将数组下标为1~n的
位置初始化为1,然后进行处理,如果某人被杀,我们将这个位置的数字置为0,然后输出当前数组元素的下标即可。
题目代码:
#include<stdio.h>
#include<string.h>
int a[10000];
int main()
{
    int m,n,i,ccount,j;   //有m个人,数到n被杀,ccount计数被杀的人的个数
    while(~scanf("%d%d",&m,&n))
    {
        ccount=0; //开始被杀人数初始化为0
        j=1; //j从1开始
        memset(a,1,sizeof(a)); //将数组初始化为1
        while(1) //永循环,人被杀完时停止
        {
            for(i=1;i<=m;i++)
            {
                if(a[i]==0)   //代表已经被杀,结束本次循环即可
                    continue;
                else
                {
                    if(j==n) //如果数到了数字n
                    {
                        a[i]=0; //数组元素值变为0,代表这个人被杀了
                        ccount++; //被杀人数加1
                        j=0; //j变为0,因为后面j会增1
                        if(ccount!=m)
                        {
                            printf("%d\n",i); //如果被杀人数不等于总人数,输出序号,因为题目说了最后一个被杀的人不用输出
                        }
                    }
                    j++; //j每次增1,代表数数
                }
            }
            if(ccount==m) //如果人全被杀完了,结束永循环
                break;
        }
    }
    return 0;
}

0 0