好玩的约瑟夫环:有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列;每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列,完成一遍游戏,所有出列的人形成新队列;游戏可能玩很多遍,每遍有新报数密码。求若干遍游戏完成后队列次序。题目输入包括若干个正整数(至少1个),第一个正整数为玩游戏人数M,后续每个正整数为每遍游戏报数密码,报数密码可能为1,题目要求按出队列顺序输出他们的编号。
#我遇到的问题
我用了一个小测验,就是二次循环往回走的时候,输出结果总是不对,我实在是不知道这是为什么了
#include <stdio.h>
#include <stdlib.h>
int main()
{
int tmp = 0;
int count = 5,f=0,M=5,N=2;
int i = 0,j=0,h;
int *arr = (int *)malloc(sizeof(int)*M);
int *brr = (int *)malloc(sizeof(int)*M);
for(h=1;h<=2;h++){
if(f==0){
for(i= 0;i < M;i++)
{
arr[i] = i+1;
}}
i = 0;j=0;
f++;
count=5;
while(count > 0)
{
if(arr[i]==0) goto end;
if(j<M)
{
tmp++;
if(tmp == N)
{
count--;
brr[j] = arr[i];//printf("%d",i);
printf("%4d",brr[j]);
arr[i]=0;
j++;
tmp = 0;
}
}
end:
i++;
if(i==M) i=0;
}N++;
// if(f==flag){
for(i = 0; i < M;i++)
{
printf("%4d",brr[i]);
}//}
printf("\n");
arr=brr;
}
return 0;
}
理清思路:1.参加游戏的人实际上是从1-M的自然数数列,循环赋值即可。2.输入人数,密码可存入同一数组或分开存放。
3.嵌套循环判定对应密码输出即可。