/*************************************************************************************
36. 猴子选大王:
① N 只猴子站成一行,每隔 M 只从头到尾报数,反复进行,报过数的退出,打
印每次退出的猴子的编号,直到剩下一只为止。
② N 只猴子站成一行,每 M 只报数。先从头到尾,报到尾后,再返回从尾到头
报数,打印每次方向及过程,直到剩下二只时,以排到后面的(指报数方向)为大王。
③ N 只猴子围成一圈,从第 P 个开始,每隔 M 只报数,打印每次过程,只剩下
一个时为大王。
***********************************************************************************/
#include <stdio.h>
#include <malloc.h>
void print_proc(int *mk, int n, int k)
{
int i;
for(i=0; i<n; i++)
printf("%2d", mk[i]);
printf(" 第%d只猴子退出/n", k);
}
void print_winner(int *mk, int n)
{
int i;
for(i=0; i<n; i++)
{
if(mk[i])
{
printf("第%d只猴子当选大王!/n",i+1);
break;
}
}
}
void Select_1()
{
int *monkey;
int i,k,counter;
int N,M;
printf("请输入猴子的个数N和报数相隔M:/n");
scanf("%d%d",&N,&M);
monkey = (int*)malloc(N*sizeof(int));
for(i=0; i<N; i++)
monkey[i] = 1;
i=0; k=0; counter = 0;
//直到只剩下一个猴子
while(counter != N-1)
{
if(monkey[i])
{
//每隔M个报数
if((++k)%M == 0)
{
monkey[i] = 0;
counter++;
print_proc(monkey,N,i+1);
}
}
//从头开始报数
if(++i==N)
i=0;
}
//显示获胜的猴子
print_winner(monkey,N);
free(monkey);
}
void Select_2()
{
int *monkey;
int i,k,counter;
int N,M;
int d;
printf("请输入猴子的个数N(N>=2)和报数相隔M:/n");
scanf("%d%d",&N,&M);
monkey = (int*)malloc(N*sizeof(int));
for(i=0; i<N; i++)
monkey[i] = 1;
i=0; k=0; d=1;
counter = 0;
//如果剩下的猴子数>2,循环
while(counter < N-2)
{
if(monkey[i])
{
if((++k)%M == 0)
{
monkey[i] = 0;
counter++;
print_proc(monkey,N,i+1);
}
}
if(i == N-1)
d = -1;
else if(i == 0)
d = 1;
i = i + d;
}
//只剩下两只猴子,取最后的一只
while(1)
{
if(monkey[i])
{
monkey[i] = 0;
counter++;
print_proc(monkey,N,i+1);
break;
}
if(i == N-1)
d = -1;
else if(i == 0)
d = 1;
i = i + d;
}
//显示获胜的猴子
print_winner(monkey,N);
free(monkey);
}
void Select_3()
{
int *monkey;
int i,k,counter;
int N,M,P;
printf("请输入猴子的个数N和报数相隔M以及开始报数编号P(P<=N):/n");
scanf("%d%d%d",&N,&M,&P);
monkey = (int*)malloc(N*sizeof(int));
//初始化
for(i=0; i<N; i++)
monkey[i] = 1;
i=P-1; k=0; counter = 0;
while(counter != N-1)
{
if(monkey[i])
{
if((++k)%M == 0)
{
monkey[i] = 0;
counter++;
print_proc(monkey,N,i+1);
}
}
if(++i==N)
i=0;
}
//显示获胜的猴子
print_winner(monkey,N);
//释放空间
free(monkey);
}
void main()
{
int i_select;
printf("请选择猴子大王选举方法:/n");
printf("1-顺序报数 2-来回报数 3-循环报数/n");
scanf("%d",&i_select);
switch(i_select)
{
case 1:
Select_1();
break;
case 2:
Select_2();
break;
case 3:
Select_3();
break;
}
}
练习36
最新推荐文章于 2022-06-16 16:23:39 发布