ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

约瑟夫环问题~C语言初学者

2026/8/8 21:40:41 拓冰建站 浏览量
约瑟夫环问题~C语言初学者 问题描述:设有n个小朋友围坐一圈玩丢手绢用编号12……n代表玩游戏的人从第kk大于等于1并且小于等于n个小朋友开始报数数到m的那个人出列。他的下一位继续从1开始报数数到m的人出列依此类推直到所有人都出列为止。输入:三个整数n k m其中n表示玩游戏的人数k表示从第k个人开始玩m表示报数的值。输出:n个整数分别对应依次输出游戏的小朋友的编号。例如: 输入13 2 3输出结果为4 7 10 13 3 8 12 5 11 6 2 9 1代码如下:#include stdio.hint main(){void f(int n,int m,int a[]);int i,n,k,m,a[1000],t,j;scanf(%d %d %d,n,k,m);tk;for(i1;in-(k-1);i,t)a[i]t;for(in-k11,j1;in;i,j)a[i]j; //把k放到了数组元素下标为1处按题目给出的示例完成到这里a[1]2a[2]3以此类推到a[13]1。f(n,m,a); // 调用函数}void f(int n,int m,int a[]){int i,j,total0; //j作为记录有多少个人参与报数了以便用此判断是不是该报数了是不是m的整数倍。for(i1,j0 ;total!n; i){if(in) ii-n;if(a[i]!0) //以及下面的把零赋值给a[i] 都是为了让每一次输出的其所在数组的那个元素变成零 这样可以有效避免这个元素对下面的产生干扰{ j;if(j%m0) { printf(%d ,a[i]); a[i]0; total; }}}}