计蒜客T1723 约瑟夫问题(C语言实现)

【题目描述】
传说约瑟夫当年活下来就是靠快速计算这个问题。n个人围成一圈,编号依次为1,2,3…n。从第一个人开始报数,数到m的人再出圈。以此类推,直到所有的人都出列。请输出依次出圈人的编号。
【输入格式】
两个整数n,m,均在[1, 100]。
【输出格式】
n个用空格分隔的整数,表示出圈人的编号。
样例输入:6 4
样例输出:4 2 1 3 6 5
耐心一些认真一些,其实并不难~
【C语言代码实现】

# include 
int main()
{
    int n, m;
    scanf("%d%d", &n, &m); // 输入两个正整数
    
    int s = n; // 变量s记录当前在圈内的人数
    int a[105] = {0}; // 数组a记录这n个人是否在圈内,初始值全为0,表示n个人全部在圈内,出圈后应修改元素为1
    int k = 0, p = 0; // 变量k记录当前报数是多少,变量p记录当报到最后一个人时,反过来从前面的哪个位置开始报数
    while (s) { // 当圈内有人时进行循环
        while (a[p] != 0) { // 找到本次报数从第几个人开始报数
            ++p;
        }
        for (int i = p; i < n; ++i) { // 遍历数组a
            if (!a[i]) { // 如果第i+1个人在圈内,
                ++k; // 报数加1
                if (k == m) { // 恰好报到m
                    printf("%d ", i + 1); // 输出第i+1个人的编号
                    a[i] = 1; // 修改对应元素为1
                    --s; // 圈内的人数要相应减1
                    k = 0; // 报数归零,从0开始
                }
            }
        }
    }
    return 0;
}

你可能感兴趣的:(c语言,算法)