问题描述:有n个人围成一圈,顺序排号。现从第i个人开始,由1至k不断报数,凡报到k的人出列。重复报数过程,直到所有人都出列为止。请编写程序模拟这n个人出列的顺序。
思路:
将n个人排列在数组中,将位置序号1~n存放到对应数据元素中a[0~n-1],因此第i个人在数组a[i-1]的位置上;从指定的第i个人(a[i-1])开始从1到k循环报数,只要没有退出就参与报数,直到有人报到k,输出存放的位置,将数组元素置为0表示已退出,退出人数加1;从下一没退出的人重新开始报数;当超过数组末尾时,i置为0从数组头开始再循环报数,直至退出人数达到总人数减1,不再报数;从头遍历数组找到没有被退出的元素,输出存放位置。
代码:
#include<stdio.h>
int main(){
int i,k,m,n,num[50],k1;
scanf("%d %d %d",&n,&k,&i); //n表示参与报数的总人数;k表示一次报数的值;i表示从第几个人开始报数;
for(int j=0;j<n;j++) num[j]=j+1; //给n个人排序号,第i个人的数组下标为i-1;
i-=1; //从第i个人的在数组中位置开始报数;
k1=0; //k1表示每次报数计数变量1~k;
m=0; //m表示退出人数;
while(m<n-1){ //当m=n-1时,也就是n-m=n-(n-1)=1仅剩一个人时退出循环
if(num[i]!=0){ //只要没有被退出,就参与计数;
k1++;
}
if(k1==k){ //计数到k时,该位置退出;
printf("%d ",num[i]); //输出退出的位置;
num[i]=0; //退出的位置置为0;
k1=0; //k开始重新计数;
m++; //退出的人数加1;
}
i++;
if(i==n) i=0; //从头开始遍历;
}
//从头遍历找没有退出的位置,输出;
i=0;
while(num[i]==0) i++;
printf("最后留下了%d号",num[i]) ;
}
思路表述欠佳,但是程序总体是可行的,希望大家多提宝贵的建议。