C语言简单实现Josephu问题,vs2019编译器

上问题:

【问题描述】
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
【测试数据】
m的初值为20;n=7,7各人的密码依次为:3,1,7,2,4,8,4。

上代码:

#include<stdio.h>
void main() {
   
	int nums[] = {
    3,1,7,2,4,8,4 }, m = 20, n = 7, N = n, x = 0;
	for (int i = 0; i < N; i++) {
   
		printf("%d ", m = (m + x) % n == 0 ? nums[x = (n--) - 1] : nums[x = (m + x) % (n--) - 1]);//利用模,模拟报数
		for (int j = x; j < n; j++)//移动已经打印的密码
			nums[j] = nums[j + 1];
	}
}

运行结果为:8 3 2 4 1 7 4