美文网首页程序员
N个人围成一圈报数

N个人围成一圈报数

作者: Joe_HUST | 来源:发表于2017-09-07 10:26 被阅读0次

1. 有N个人围成一圈,顺序排号,从第一个人开始报数,凡是报到M的人退出圈子,问最后留下的几号?

#define N 15
int main(int argc, char const *argv[])
{
    int M;
    scanf("%d",&M);

    int people[N]={0};
    int people_remain = N;
    int people_out = 0;
    int people_count = 1;
    int i = 0;
    while(people_remain!=1){
        if (0 == people[i]){
            if(M == people_count){
                people[i] = 1;
                --people_remain;
                ++people_out;
                people_count=1;
            }
            else
                ++people_count;
        }
        i=(i+1)%N;
    }
    for (int i = 0; i < N; ++i)
    {
        if (people[i] == 0)
            printf("%d\n",i+1);
    }
    return 0;
}

2. N个人围成一圈,从第S个人开始顺时针1,2,3,4,...M的顺序报数,数到M的人出圈,然后从出圈的下一个人开始重复此过程,输出所有出圈的人的顺序。

int main(int argc, char const *argv[])
{
    int M,S,N;
    printf("please input people number\n");
    scanf("%d",&N);//总人数

    printf("please input counting cycle\n");
    scanf("%d",&M);//报数循环

    printf("please input counting start people\n");
    scanf("%d",&S);//从第几个人开始

    int *people =(int *)calloc(N,sizeof(int));
    int people_remain = N;
    int people_out = 0;
    int people_count = 1;
    int i = S-1;

    printf("出圈人的顺序为:");
    while(people_remain!=1)
    {
        if (0 == people[i])
        {
            if(M == people_count)
            {
                printf("%d,",i+1);
                people[i] = 1;
                --people_remain;
                ++people_out;
                people_count=1;
            }
            else
                ++people_count;
        }
        i=(i+1)%N;
    }
    printf("\n");
    for (int i = 0; i < N; ++i)
    {
        if (people[i] == 0)
            printf("%d\n",i+1);
    }
    return 0;
}

** N个人围成一圈,从第1个人开始顺时针1,2,3,4,...M的顺序报数,数到M的人出圈,然后从出圈的下一个人开始重复此过程,直到圈中所剩的人数为M-1个人。输出所有出圈的人的顺序,并输出剩余的人的编号**

int main(int argc, char const *argv[])
{
    int M,N;
    printf("please input people number\n");
    scanf("%d",&N);

    printf("please input counting cycle\n");
    scanf("%d",&M);

    int *people =(int *)calloc(N,sizeof(int));
    int people_remain = N;
    int people_count = 1;
    int i = 0;
    printf("出圈人的顺序为:");
    while(people_remain!=M-1)
    {
        if (0 == people[i])
        {
            if(M == people_count)
            {
                printf("%d,",i+1);
                people[i] = 1;
                --people_remain;
                people_count=1;
            }
            else
                ++people_count;
        }
        i=(i+1)%N;
    }
    printf("\n");

    printf("剩下的人的编号为:");
    for (int i = 0; i < N; ++i)
    {
        if (people[i] == 0)
            printf("%d,",i+1);
    }
    printf("\n");
    return 0;
}

相关文章

  • N个人围成一圈报数

    1. 有N个人围成一圈,顺序排号,从第一个人开始报数,凡是报到M的人退出圈子,问最后留下的几号? 2. N个人围成...

  • 围圈报数问题的一种算法的原理解析

    围圈报数问题描述如下:有n个人围成一圈,依次编号为0,1,2,3......,然后从0开始报数,每次报数为M的倍数...

  • 使用单链表解决约瑟夫问题

    问题描述: N个人围成一圈,从第k个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复...

  • 算法笔记_06:蓝桥杯练习 筛选号码

    1. 问题描述 问题描述有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的...

  • 蓝桥杯算法训练-筛选号码问题(Java语言)

    描述 有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一...

  • josephus 约瑟夫环递归解决分析

    题目:n个人围成一圈(编号从1到n),从第1个人开始报数,报到m的人出列,从下一个人再重新报数,报到m的人出列,如...

  • 数 3 游戏 2

    题目 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,问最后...

  • 数 3 游戏 1

    题目 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,问最后...

  • Rust语言编程实例100题-069

    Rust语言编程实例100题-069 题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到...

  • 约瑟夫环

    N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数...

网友评论

    本文标题:N个人围成一圈报数

    本文链接:https://www.haomeiwen.com/subject/kaibjxtx.html