请问这题怎么做~
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]);
}