1. 猴子选大王
有M只猴子围成一圈,每只各一个从1到M中的编号,打算从中选出一个大王;经过协商,决定出选大王的规则:从第一个开始循环报数,数到N的猴子出圈,最后剩下来的就是大王。要求:从键盘输入M、N,编程计算哪一个编号的猴子成为大王
#i nclude
int choose(int num,int del)
{
int i;
int a[100];
for(i=0;i<num;i++)
a[i]=1; //猴子状态初始化,为1表示可能被选上,为0表明没希望了;
int sum=0, //循环记数;
countOne=num; //累积记数初始化,大于1表明还有大王候选人;
while(countOne>1)
{
countOne=0;
for(i=0;i<num;i++)
{
sum+=a[i];
if(sum==del)
sum=a[i]=0; //淘汰倒霉猴子;
countOne+=a[i];
}
}
for(i=0;i<num;i++)
if(a[i]!=0)
return i; //找到幸运猴子编号(从0开始的);
}
void main()
{
int num,del;
cout<<"请输入猴子总数和淘汰数:";
cin>>num>>del;
cout<<"第"<<choose(num,del)+1<<"个猴子为王!"<<endl;
}
2. 急!!猴子选大王!!
程序包括2大模块,分别是猴子编号模块、选大王模块。
3. 关于猴子选大王
参考答案 11、黑夜给了我一双黑色的眼睛,可我却用它来翻白眼。
4. 猴子选大王问题
#include
#include
typedef struct monkey
{
int num;
struct monkey *next;
} Monkey,*LINK;
/*创建循环链表,容纳M个猴子。返回指向链表头结点的指针*/
LINK createList(int M)
{ LINK p,head1,p2;
int i;
head1=p=p2=(LINK)malloc(sizeof(Monkey));
for(i=1;i<M;i++)
{
p=(LINK)malloc(sizeof(Monkey));
p2->next=p;
p2=p;
}
p2->next=head1;
p=head1;
printf("对猴子进行编号!\n");
for(i=1;i<=M;i++)
{
p->num=i;
printf("%d号猴子:%d\n",p->num,p->num);
p=p->next;
}
return head1;
}
/*形成循环链表*/
/*从headP指向的循环链表中选大王,数到N的猴子淘汰,将依次淘汰出来的猴子插入到headPtr2指向的链表中*/
void selectKing(LINK head,int N,int M)/*N>=2*/
{
LINK p,p2,head2=NULL;
int i;
i=0;
p=head;//p指向第一个结点
while(1)
{
i++;
printf("%d号猴子报:%d\n",p->num,i);
if(p->next==p)
break;//此为while循环的出口
if(i==N)//if语句中是删除结点的过程
{
i=0;
printf("%d号猴被淘汰\n",p->num);
printf("\n");
p2->next=p->next;//在此删除结点p
p=p2->next;//p指向它的下一个结点
continue;
}
else
{
if(i==N-1)
p2=p;//保存将要退出结点的前一个结点(存到p2中)
p=p->next;
}
}
}
int main()
{
LINK head=NULL;
int M,N;
printf("输入猴子数量:");
scanf("%d",&M); /*猴子个数*/
printf("输入选定的一个小于猴子总数的数:");
scanf("%d",&N); /*count=3,表示每次数到3的猴子出局*/
head=createList(M);/*创建循环链表*/
selectKing(head,N,M);/*选大王*/
return 0;
}
5. 7、 猴子选大王**
#include
#include
struct listNode{
int data;
struct listNode *nextPtr;
};
typedef struct listNode LISTNODE;
typedef LISTNODE * LISTNODEPTR;/*LISTNODEPTR:指向LISTNODE指针*/
void printList(LISTNODEPTR currentPtr);/*打印链表*/
void destroyList(LISTNODEPTR headPtr);/*释放链表各个结点*/
LISTNODEPTR createList(int n);
void selectKing(LISTNODEPTR headPtr1,int n);
int main(int argc, char *argv[])
{
LISTNODEPTR headPtr1=NULL,headPtr2=NULL;
int count,monkeys;
int n;
printf("input the amount of monkeys:");
scanf("%d",&monkeys); /*猴子个数*/
printf("input the count number:");
scanf("%d",&count); /*count=3,表示每次数到3的猴子出局*/
headPtr1=createList(monkeys);/*创建循环链表*/
selectKing(headPtr1,count);/*选大王。headPtr1指向循环链表。headPtr2指向由淘汰猴子组成地链表*/
system("PAUSE");
return 0;
}
/*创建循环链表,容纳n个猴子。返回指向链表头结点的指针*/
LISTNODEPTR createList(int n)
{
LISTNODEPTR headPtr=NULL,tailPtr,currentPtr;
int i;
for(i=1;i<=n;i++){
currentPtr=(LISTNODEPTR)malloc(sizeof(LISTNODE));
if(currentPtr==NULL)
printf("memory malloc wrong\n");
else{
currentPtr->data=i;
currentPtr->nextPtr=NULL;
if(headPtr==NULL){/*若是作为头结点*/
headPtr=currentPtr;
tailPtr=currentPtr;
}
else{/*将结点追加到链表末尾*/
tailPtr->nextPtr=currentPtr;
tailPtr=currentPtr;
}
}
}
tailPtr->nextPtr=headPtr;/*形成循环链表*/
return headPtr;
}
/*从headPtr1指向的循环链表中选大王,数到n的猴子淘汰,将依次淘汰出来的猴子插入到headPtr2指向的链表中*/
void selectKing(LISTNODEPTR headPtr1,int n)/*n>=2*/
{
LISTNODEPTR prePtr1=NULL,currentPtr1,headPtr2=NULL,tailPtr2;
int count;
count=0;
/*使currentPtr1指向循环链表的最后一个结点*/
currentPtr1=headPtr1;
while(currentPtr1->nextPtr!=headPtr1)
currentPtr1=currentPtr1->nextPtr;
while(currentPtr1!=currentPtr1->nextPtr){
/*往后数一个猴子*/
prePtr1=currentPtr1;
currentPtr1=currentPtr1->nextPtr;
count++;
/*若数到n,则淘汰currentPtr指向的猴子*/
if(count%n==0){
/*从headPtr1指向链表中拆下currentPtr指向的结点*/
prePtr1->nextPtr=currentPtr1->nextPtr;
currentPtr1->nextPtr=NULL;
/*将currentPtr1指向的结点插入到headPtr2指向链表中*/
if(headPtr2==NULL){/*若headPtr2指向的为空链表*/
headPtr2=currentPtr1;
tailPtr2=currentPtr1;
}
else{ /*将拆下来的结点组装到headPtr2指向的链表上*/
tailPtr2->nextPtr=currentPtr1;
tailPtr2=tailPtr2->nextPtr;
}
/*currentPtr1指向上一个结点,为下一次数数做准备*/
currentPtr1=prePtr1;
}
}
printf("大王是:%d\n",currentPtr1->data);
printf("淘汰的猴子是:");
printList(headPtr2);
/*释放链表*/
destroyList(headPtr2);
free(currentPtr1);
}
/*函数功能:遍历链表,打印链表中各结点的值。
参数说明:指向结点的指针,接收链表头接点的值*/
void printList(LISTNODEPTR currentPtr)
{
if (currentPtr==NULL)
printf("the list is empty\n");
else{
printf("the list is:\n");
while(currentPtr!=NULL){
printf("%d--->",currentPtr->data);
currentPtr=currentPtr->nextPtr; /*currentPtr指向下一个结点*/
}
printf("NULL\n\n");
}
}
void destroyList(LISTNODEPTR headPtr)
{
LISTNODEPTR tempPtr;
while (headPtr!=NULL){
tempPtr=headPtr;
headPtr=headPtr->nextPtr;
free(tempPtr);
}
}
6. M只猴子选大王
顺便帮你把语句也解释好算了
#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<n;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删除当前的结点,然后再继续判断。
7. 猴子选大王 c#
这个题解是错误的,它忽略了猴子是按圆圈站的条件
看着个,我刚写的
#include
int main()
{
int m,n,s=0,i=1,p=0,a[100];
scanf("%d %d",&m,&n);
for(i=1;i<=m;i++)
a[i]=1;
for(i=1;i<=m+1;i++)
{
if(i>m) i=1;
if(a[i]==1) p=p+1;
if(p==n)
{
a[i]=0;
s=s+1;
p=0;
}
if(s==m-1) break;
}
for (i=1;i<=m;i++)
if(a[i]==1) printf("%d",i);
return 0;
}
要加分哦
8. c++ 猴子选大王
http://bbs.lehu.shu.edu.cn/Article.aspx?aid=25182
作为参考