请问这题怎么做~
n个人围成一个圈,每个人对应一个编号,比如说,10个人,编号就是1——10。现在从第一个开始报数1,2,3这三个数。报到三的人就退出圈子,这样报到最后留下来的那个是员阿里编号为几的?(比如4个人,第一轮下来1——4报的数分别是1,2,3,1.报数为3的退出。此时,编号为1的要接上轮的编号为4的继续报数,应报数2.)输出那个留下来的人的编号~
希望各位帮忙啊,越简洁越好~
第一种方法: #include<stdio.h> #define M 10 #define N 3 void main(void) { int a[M], b[M]; /*数组a存放圈中人的编号,数组b存放出圈人的编号*/ int i, j, k; for(i = 0; i < M; i++) /*对圈中人按顺序编号1-M*/ a[i] = i + 1; for(i = M, j = 0; i > 1; i--) { /*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/ for(k = 1; k <= N; k++) /*1至N报数*/ if(++j > i - 1) j = 0;/*最后一个人报数后第一个人接着报,形成一个圈*/ b[M-i] = j?a[j-1]:a[i-1]; /*将报数为N的人的编号存入数组b*/ if(j) for(k = --j; k < i; k++)/*压缩数组a,使报数为N的人出圈*/ a[k]=a[k+1]; } printf("按次序输出出圈人的编号为\n"); for(i = 0;i < M - 1; i++) /*按次序输出出圈人的编号*/ printf("%6d", b[i]); printf("\n最后一人编号为%6d\n", a[0]); /*输出圈中最后一个人的编号*/ }
#include<stdio.h> #define M 10 #define N 3 void main(void) { int a[M], b[M]; int i, j, k=0; for(i = 0; i < M; i++) a[i] = i + 1; for(i=0, j = 0; k<=M-1; i++) { if (a[i]==0) { if (i==M-1) i=-1; continue; } if (++j==N) { b[k++] = a[i]; j=0; a[i]=0; } if (i==M-1) i=-1; } printf("按次序输出出圈人的编号为\n"); for(i = 0;i < M - 1; i++) printf("%6d", b[i]); printf("\n最后一人编号为%6d\n", b[M-1]); }