『壹』 求大神編一段C程序,猴子當大王。
用鏈表寫的話比較好,資源佔用少;用數組的話也行,如下:
這是一種關於約瑟夫循環的問題,所以一般用的循環單鏈表數據結構,具體細節參照我網路空間的一篇文章
#include"stdio.h"
#include<stdlib.h>
voidmain(void)
{
intresult(int*p,intn,intlimit);
intn=0;//總人數
intm=0;//報數截止號
int*p;
for(;;)
{
printf("inputnumberofnandm:");
scanf("%d%d",&n,&m);
if(m<=0||n<=0)
{
exit(0);
}
p=(int*)malloc(n*sizeof(int));
printf("ThekingisNO.%d ",result(p,n,m));
delete[]p;
}
}
intresult(int*p,intn,intlimit)
{
inti=0;
for(i=0;i<n;i++)
p[i]=i+1;
i=0;//i為每次循環時計數變數
intk=0;//k為按1,2,3...limit報數時的計數變數
intm=0;//m為退出人數
while(m<n-1)//當退出人數比n-1少時(即未退出人數大於1時)執行循環體
{
if(p[i]!=0)k++;//如果編號為0,就不報數;如果編號不為0,報數加1
if(k==limit)//將退出的人的編號置為0
{
p[i]=0;
k=0;//重新開始報數
m++;//退出人數加1
}
i++;
if(i==n)i=0;//報數到尾後,i恢復為0
}
i=0;
while(p[i]==0)i++;
returnp[i];
}
測試結果:
『貳』 C語言編程猴子吃桃子問題
#include<stdio.h>
intmain(){
inttotal=1,delta=1,i;
for(i=99;i>0;--i){
total=2*delta+1;
delta=total/2+1;
printf("第%d天,%d個桃子 ",i,total);
}
return0;
}
『叄』 猴子選大王的編程,數據結構方法
如果給好評的話,麻煩寫一句:
章魚桶是個好人
不確定具體題目,從網上摘抄來的題目:
山上有n只猴子要選大王,選舉辦法如下:所有猴子從1到n進行編號並圍坐一圈,從第一號開始按順序1,2,...m繼續報數,凡是報m號的猴子都退出到圈外,照此循環報數,直到圈內只剩下一隻猴子時,這只猴子就是大王.輸出大王的編號。
這個題目是循環鏈表的應用,循環鏈表參見:
http://ke..com/view/178643.htm
#include<stdio.h>
#include<stdlib.h>
{
intposition;
CircularLinkedListElement*next;
};
intmain(void)
{
/*
變數聲明
*/
intn,m;
inti;
CircularLinkedListElement*start;
CircularLinkedListElement*p;
CircularLinkedListElement*q;
intstep;
/*
讀入猴子數量n,以及淘汰的號碼m
注意輸入的是正整數,為了滿足一般從0開始計數的規律,讀入後將n、m均減一
*/
printf("Pleaseentermonkeysnumbern:");
scanf("%d",&n);
n--;
if(n<=0)
{
fprintf(stderr,"**Error:Monkey'snumbershouldbepositive. ");
return1;
}
printf("Pleaseenterobsoletenumberm:");
scanf("%d",&m);
if(m<=0)
{
fprintf(stderr,"**Error:. ");
return1;
}
m--;
/*
創建循環鏈表
*/
start=(CircularLinkedListElement*)malloc(sizeof(CircularLinkedListElement));
if(start==NULL)
{
fprintf(stderr,"**Error:mallocerror. ");
return1;
}
start->position=0;
start->next=NULL;
p=start;
for(i=1;i<=n;i++)
{
q=(CircularLinkedListElement*)malloc(sizeof(CircularLinkedListElement));
if(q==NULL)
{
fprintf(stderr,"**Error:mallocerror. ");
return1;
}
q->position=i;
q->next=NULL;
p->next=q;
p=q;
}
p->next=start;
/*
開始淘汰猴子
*/
step=1;
while(start->next!=start)
{
printf("#step%d ",step++);
printf("Currentmonkeys:");
p=start;
while(p->next!=start)
{
printf("%d",p->position+1);
p=p->next;
}
printf("%d ",p->position+1);
p=start;
for(i=0;i<(m-1);i++)
p=p->next;
q=p->next;
p->next=q->next;
start=q->next;
printf("Obsoletemonkeyis:%d ",q->position+1);
free(q);
}
/*
輸出猴王
*/
printf("Themonkeykingis%d. ",start->position+1);
return0;
}
英文系統,所以輸出都寫的是英文,見諒
『肆』 java編程猴子選猴王問題講下思路就好了。
利用數組,進行循環
int a[]=new int[max_size];
for(i=0;i<M;i++) a[i]=0;
int flag=0;
for(i=0,j=0;(i<M)&&(flag<M-1);i++)
if (a[i]==0) {
++j;
if(j==N){
j=0;
a[i]=1;
flag++;}
}
system.out.println("i+1就是那個猴王");
『伍』 用C++編程 猴子選大王
#include <iostream>
using namespace std;
template <class datatype> class LinkList;
template <class datatype>
class Node
{
friend class LinkList<datatype>;//友元類
private:
datatype data;//計猴子號
Node<datatype> *next;
};
template <class datatype>
class LinkList
{
public:
LinkList();
void monkey(int m); //建立有m個元素的單鏈表
datatype Get(int a); //取單鏈表中第i個結點的元素值
datatype Delete(int n); //在單鏈表中刪除第n個結點
private:
Node<datatype> *head,*tail; //單鏈表的結構指針
};
template <class datatype>
LinkList<datatype>:: LinkList( )
{head=new Node<datatype>; head->next=NULL;}
template <class datatype>
void LinkList<datatype>::monkey(int m)
{
int i;//整型變數i,用於計數
Node<datatype> *p,*q;//聲明結構指針
p=new Node<datatype>;//為p分配空間
p->data=1; //初始化p結點data域為1
p->next=NULL;//初始化p結點next域為空
head=p;//鏈表頭指針head賦值為p
q=p; //q賦值為p
for (i=2; i<=m; i++) //用循環結構構造鏈表
{
p=new Node<datatype>;//為p配內存空間
p->data=i; //初始化p結點data域為i,表示猴子號
q->next=p; //將p點加到鏈表尾部
q=p; //讓指向鏈表尾部結點
p->next=NULL; //鏈表尾部為空
}
tail=q;//鏈表尾
tail->next=head;//鏈表尾部指向鏈表頭,形成循環鏈表
}
template <class datatype>
datatype LinkList<datatype>::Delete(int n)
{
Node<datatype> *p,*q;
int j=0;
q=tail; //指向循環鏈表尾部
cout<<"被刪除的猴子號碼依次為:"<<endl;
while (q!=q->next) //剩餘結點數不為1,則繼續循環
{
p=q->next;//p賦值給下一個相鄰結點
j++;
if(j%n==0)
{
cout<<p->data<<ends;
q->next=p->next;//刪除此結點
delete p;//釋放空間
p=NULL;
}
else q=p;//q指向相鄰的下一個結點p
}
cout<<endl;
head=q;//head指向結點q,q為鏈表中剩餘的一個結點
return head->data;
}
template <class datatype>
datatype LinkList<datatype>::Get(int a)
{
Node<datatype> *p;
int j;//計數器
p=head->next; j=1; //或p=head; j=0;
while (p && j<a)
{
p=p->next; //工作指針p後移
j++;
}
if (!p) throw "a值不合法";
else return p->data;
}
void main()
{
int m,n;
LinkList<int>mon;
cout<<"請輸入猴子的總數:"<<endl;
cin>>m;
cout<<"請輸入要刪除猴子的所報的數:"<<endl;
cin>>n;
mon.monkey(m);
mon.Delete(n);
cout<<"猴王是:"<<mon.Get(1)<<"號"<<endl;
}