1474: 小孩报数问题
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 473 Solved: 213
[Submit][Status][Web Board]
Description
有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。
Input
每组测试数据有3个正整数,小孩的人数N(N<=64),W,S (W < N)。
Output
输出小孩出列的顺序。
Sample Input
5 2 3
Sample Output
4
2
1
3
5
————————————————
题目小解析:循坏反复,典型的约瑟夫环
说明:刚学C语言一个学期,用的最基本的C语言知识,变量命名也十分的~通俗,中文拼音~望见谅~
#include <stdio.h>
int k[70];
int main()
{
int n=1,ge=0,biaoji=0,w=0,s=0,i=0,cnt=0,shifou=1;//ge表示几个人参与,数值等于n
while(~scanf("%d%d%d",&n,&w,&s)){ //biaoji表示哪个人在报数
for(i=0;i<n;i++) k[i]=1; //cnt为当前报数为多少
biaoji=w; //shifou表示原来当前位置同学是否已经出列,1表示存在,0表示已经出列
while(ge<=n-1){
while(cnt<s){
if(biaoji-1==n) biaoji++;
if(k[(biaoji-1)%n]==1){
cnt++;
if(cnt==s){
cnt=0;
break;
}
}else{
biaoji=(biaoji+1)%n;
if(biaoji==0) biaoji=n;
shifou=0;
}
if(shifou==1){
biaoji=(biaoji+1)%n; //注意要判断是否下一位等于n,取余之后就为0了,加1
if(biaoji==0) biaoji=n;
}
shifou=1;
}
printf("%d\n",biaoji);
k[biaoji-1]=0;
biaoji=(biaoji+1)%n;
if(biaoji==0) biaoji=n;
ge++;
}
ge=0,cnt=0;
}
return 0;
}