2 lss366 lss366 于 2016.01.27 13:27 提问

M只猴子选大王的另一种问法,怎样用C语言编程解决啊,急求

M只猴子选大王,选举办法如下:所有猴子按1...M编号围坐一圈,从第1号开始按顺序1,2...N报数,报到N的猴子退出到圈外,再从下一个猴子开始继续1,2...N报数,报到N的猴子退出圈外,如此循环,直至圈内只剩下一只猴子时就说大王,给定M和最后出圈的者的编号S,求最小的N

6个回答

q3733353520
q3733353520   2016.02.17 18:12
stumpy
stumpy   2016.01.27 13:34

来自百度:

#include
#include
#define n 19
#define m 4
typedef struct monkey
{
int num;
struct monkey *next;
} Monkey,*LINK;
void main()
{
LINK p,head,p2;
int i;
head=p=p2=(LINK)malloc(sizeof(Monkey));//三个指针指向同一块内存
for(i=1;i {
p=(LINK)malloc(sizeof(Monkey));
p2->next=p;
p2=p;
}
p2->next=head;//把链表的首尾相连
p=head;//p指向了第一个结点
printf("对猴子进行编号!\n");
for(i=1;i<=n;i++)
{
p->num=i;//从第一个结点到最后一个结点依次给猴子编号
printf("%d号猴子:%d\n",p->num,p->num);
p=p->next;
}//循环结束,p指向了最后一个结点
i=0;
p=head;//再把p指向第一个结点
while(1)
{
i++;
printf("%d号猴子报:%d\n",p->num,i);
if(p->next==p)
break;//此为while循环的出口
if(i==m)//if语句中是删除结点的过程
{
i=0;
printf("%d号猴被淘汰\n",p->num);
printf("\n");
p2->next=p->next;//在此删除结点p
p=p2->next;//p指向它的下一个结点
continue;
}
else
{
if(i==m-1)
p2=p;//保存将要退出结点的前一个结点(存到p2中)
p=p->next;
}
}
printf("胜出:%d",p->num);//最后剩下的结点就是获胜的结点
}
这个程序其实就是形成了一个有19个结点的循环链表,当碰到m的时候,用这两句话p2->next=head;p=head删除当前的结点,然后再继续判断。

FGF_C
FGF_C   2016.01.27 13:34

最简单的办法就是用个数组模拟就行

91program
91program   Ds   Rxr 2016.01.27 14:15
qq_27183003
qq_27183003   Ds   Rxr 2016.01.27 16:29
 #include <stdio.h>  
#define MaxSize 100  
void king(int m,int n)  
{  
    int p[MaxSize];  
    int i,j,t;  
    for (i=0; i<m; i++)         //构建初始序列,记录m只猴子在圈中  
        p[i]=1;  
    t=-1;                       //首次报数将从起始位置为0,即第1只猴子开始,因为在使用p[t]前t要加1  
    printf("出列顺序:");  
    for (i=1; i<=m; i++)        //循环要执行m次,有m个猴子要出圈  
    {  
        j=1;      // j用于报数  
        while(j<=n)  //  
        {  
            t=(t+1)%m;        //看下一只猴子,到达最后时要折回去,所以用%m  
            if (p[t]==1) j++; //等同于if (p[t]==1) j++;仅当q猴子在圈中,这个位置才报数  
        }  
        p[t]=0;   //猴子出圈  
        printf("%d ",t+1);      //输出出圈猴子的编号  
    }  
    printf("\n");  
}  

int main()  
{  
    int m,n;  
    scanf("%d %d", &m, &n);  
    king(m,n);  
    return 0;  
}
flx413
flx413   2016.01.28 21:58
//PAT-猴子选大王

 #include <stdio.h>
int main()
 {
     int m=3, s = 0;
     int i;
     int N;
    scanf("%d",&N);
     for (i = 2; i <= N; i++)
     {
         s = (s + m) % i;
     }
     printf("%d\n",s+1);
    return 0;
 }

flx413
flx413 这个是N只猴子报数,数到3退出的,按题目要求把在运行时输入m值就行了
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!