相信每个人学习c语言的时候,都会在习题,教材,别人口中听到类似这么个问题
一群小孩围坐一圈,依次报数1,2,3,报到3的出列,再从出列人的后面依次报数,如此下去,直至所有人全部出去
难点就是
1.求出列的人
2.和如何处理出列的人。
#include <stdio.h>
int josef(int a[],int n,int m){
int i,j,k=0;
for(i=0;i<n;i++){ //打印n个出列人
j = 1;
while(j<m){ //报数,报到m出列
while(a[k]==0){ //报到已经出列的人(虽然已经出列,但依旧会遍历到他,所以经过他时,把他跳过,不报数(即j不执行++操作)
k = (k+1)%n;
}
j++;
k=(k+1)%n;
}
while(a[k]==0){ //当这次需要出列的人已经出列,则继续k++,直至遇到那个没有出列人
k = (k+1)%n;
}
printf("%d ",a[k]); //打印出列人
a[k] =0; //把出列人的值置零
}
return 0;
}
int main(){
int a[100]={};
int i,j,m,n;
printf("input n and m:\n");
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
a[i] = i+1;
}
printf("\n output: \n");
josef(a,n,m);
printf("\n");
return 0;
}