#include <stdio.h>
int main()
{
int A[100],B[100],N,n,m,i,j,Yet,Initial,Out,k;
for(i=0;i<100;i++){
scanf("%d",&(A[i]));
scanf("%d",&(B[i]));
if(A[i]==0) break;
}
N=i;//用N记录输入数据的总组数
int b[N]; //用于存储不同m, n对应的猴王的编号
for(k=0;k<N;k++){
n=A[k],m=B[k],Initial=0;
//Initial是最开始报数的猴的编号【注意归零问题】
int a[n];
for(i=0;i<n;i++) a[i]=1;
//将数组a[n]中的每个元素都赋初值为1
for(i=0;i<n-1;i++){
//只做n-1次循环,每次循环出局一猴,最后正好只剩下一猴
Yet=0;
for(j=Initial;Yet<m;j++){
if(j>=n) j=j%n;
if(a[j]==1) Yet++;
//Yet表示已报数的猴的累计数目
}
Out=j;//变量Out表示出局的猴的编号
if(Out>=n) Out=Out%n;
a[Out]=0;
Initial=j+1;
}
for(i=0;i<n;i++){
if(a[i]==1) b[k]=i+1;
}
}
for(i=0;i<N;i++) printf("%d\n",b[i]);
return 0;
}
输入:
12 4
0 0
输出:
12
https://blog.csdn.net/qq_41863100/article/details/122121828
if(Out>=n) Out=Out%n;
a[Out]=0;
这个代码非常有问题的,要判断out比n大应该在循环里面判断,循环,一直数,数够了4个,就out
不能先返回一个数,然后把它对n取余,那取余之后的数是1还是0呢,如果本来就是0你这样操作毫无意义呀
-=-=-=-
for(i=0;i<n;i++){
if(a[i]==1) b[k]=i+1;
}
这里没有break,也就是会一直被最后是1的数字覆盖
你12位置永远是1,没有被设置成0,所以一直打印12
也就是说,你的数组里有多组数据的数都是1.你应该在循环j的时候就直接把那个元素设置成0,不要分成2个步骤。