c++ 猴子选大王
#include
using namespace std;
class mon
{
private:
int *monkey;
int M;
int N;
public:
mon(int x,int y):M(x),N(y)
{
monkey=new int [x];
}
void bianhao()
{ for(int i=0; i<M; i++)
{
monkey[i]=i;//给猴子编号
}
}
void showall()
{for(int i=0; i<M; i++)
{
cout<<monkey[i]<<"";
}
}
void show()
{ int k = 1;
cout<<"After "<<k<<" times elimination, the monkeys left are:"<<endl;
for(int i=0; i<M; i++)
{
if(monkey[i]!=0)
{
cout<<monkey[i]<<"";
}
}
}
void tichu()
{
int k=1;//第k个离开的猴子
int n=-1;//数组下标,下一个为0表示从第一个猴子开始数数
while(true)
{
//在圈中开始剔除
for(int j=0; j<N;)
{
n=(n+1)%M;
if(monkey[n]!=0) //如果该猴子还在圈中,则参加计数
{
j++;
}
}
if(k==M) //如果已经全部剔除完成,则跳出循环
{
break;
}
monkey[n]=0;
show();
cout<<endl;
k++;
}
// break语句跳转至此,输出胜利者编号
cout<<"The No."<<monkey[n]<<" monkey is the winner."<<endl;
}
~mon(){delete[]monkey;}
};
void main()
{ int x;int y;
cout<< "输入猴子总数 随机选取的数"<<endl;
cin>>x;
cin>>y;
mon a(x,y);
cout<<" Before eliminating, the monkeys are:"<<endl;
a.bianhao();
a.showall();
a.tichu();
}
#include
using namespace std;
template class LinkList;
template
class Node
{
friend class LinkList;//友元类
private:
datatype data;//计猴子号
Node *next;
};
template
class LinkList
{
public:
LinkList();
void monkey(int m); //建立有m个元素的单链表
datatype Get(int a); //取单链表中第i个结点的元素值
datatype Delete(int n); //在单链表中删除第n个结点
private:
Node *head,*tail; //单链表的结构指针
};
template
LinkList:: LinkList( )
{head=new Node; head->next=NULL;}
template
void LinkList::monkey(int m)
{
int i;//整型变量i,用于计数
Node *p,*q;//声明结构指针
p=new Node;//为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;//为p配内存空间
p->data=i; //初始化p结点data域为i,表示猴子号
q->next=p; //将p点加到链表尾部
q=p; //让指向链表尾部结点
p->next=NULL; //链表尾部为空
}
tail=q;//链表尾
tail->next=head;//链表尾部指向链表头,形成循环链表
}
template
datatype LinkList::Delete(int n)
{
Node *p,*q;
int j=0;
q=tail; //指向循环链表尾部
cout<<"被删除的猴子号码依次为:"<<endl;
while (q!=q->next) //剩余结点数不为1,则继续循环
{
p=q->next;//p赋值给下一个相邻结点
j++;
if(j%n==0)
{
coutdata<<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
datatype LinkList::Get(int a)
{
Node *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;
LinkListmon;
cout<<"请输入猴子的总数:"<<endl;
cin>>m;
cout<<"请输入要删除猴子的所报的数:"<<endl;
cin>>n;
mon.monkey(m);
mon.Delete(n);
cout<<"猴王是:"<<mon.Get(1)<<"号"<<endl;
}
作为参考
#include<iostream>
using namespace std;
int shan(int m,int n );
int n,m,posicion=0;
int *fu ;
int main()
{
cin>>n>>m;
fu=new int[n+1];
for(int i=1;i<=n;i++)
{
fu[i]=i;
}
shan(m, n) ;
}
int shan(int m,int n)
{
if(n>0)
{
posicion+=m;
while(posicion>n)
{
posicion-=n;
}
cout<<fu[posicion]<<endl;
for(int c=posicion;c<=n;c++)
{
fu[c]=fu[c+1];
}posicion--;
shan(m,n-1);
}
}
输入 10 3 或 20 3试试
约瑟夫环问题
有公式
f[1]=0;
f[i]=(f[i-1]+m)%i; (i>1)
var
n,i,j,num:longint;
s:array [1..50000] of longint;
procedure chuli;
begin
for i:=1 to n do
begin
if i mod 3=0
then begin s[i]:=0;num:=num+1; end;
end;
end;
procedure sha;
begin
for i:=1 to n do
begin
if s[i]=0
then begin
for j:=i to n do
s[j]:=s[j+1];
end;
end;
n:=n-num;
end;
procedure fanxiang;
var temp:longint;
begin
for i:=1 to (n div 2) do
begin
temp:=s[n+1-i];
s[n+1-i]:=s[i];
s[i]:=temp;
end;
end;
begin
readln (n);
for i:=1 to n do
s[i]:=i;
while n<>2 do
begin
num:=0;
chuli;
sha;
fanxiang;
end;
write (s[1]);
end.
端咏双香: 看看这个如何:#include<iostream.h> 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表明还...
陇川县13079695504: 图形模拟猴子选大王过程C/C++有M只猴子围成一圈,每只各一个从1到M中的编号,打算从中选出一个大王;经过协商,决定出选大王的规则:从第一个开... - ?
端咏双香:[答案] 设置一个“环形”链表,就是让最后一个元素(猴子)的next指针指向第一个,然后循环循环删除,设置一个链表元素个数标志,当这个数变成1时退出循环
陇川县13079695504: 用C++编程 猴子选大王?
端咏双香: //我没有具体的调试,给你试着调试跟踪,这样更能理解 #include <iostream.h> void main() { int monkey[100]={0},m,n,i=0,j=0,k=0; cin >> m >> n ; while (i<m-1) //M个猴子,要选m-1次 { if (monkey[j]==0) //如果这个猴子还没有退出 { k++; //则报数++ if ...
陇川县13079695504: 用C++实现只猴子选大王,选举办法如下:从头到尾 1,2,3报数,凡报3的退出,余下的从下一个开始循环 - ?
端咏双香: #include "stdafx.h"#include <iostream.h> class Monkey { public: Monkey * left; Monkey * right; int id; Monkey::Monkey(int _id) { id = _id; } }; class MonkeyRing { public: int monketNumAll; int monketNum; int ringNumberOff; Monkey * head; void ...
陇川县13079695504: C++猴子选大王问题 - ?
端咏双香: 花了一点时间思考才写出来的.由于采用遍历数组作为while循环的条件表达式,所以开销较大,应该可以优化的.<br>程序代码:<br><script><br>//假设7个猴子围成一圈.将7个猴子存储在一个数组中<br>var arr=new Array(7);<br>arr[0]=1;<br>arr[...
陇川县13079695504: 如何用c++编写猴子选大王问题?
端咏双香: 看看这个如何: #include<iostream.h> 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...
陇川县13079695504: 猴子选大王 C++ - ?
端咏双香: #include<iostream> using namespace std; void main(){ char names[100][20]; int n,m,i,j,k,t,xh[100]={0}; cin >>n >>m; for(i=0; i<n; i++){ xh[i]=i+1; cin >>names[i]; } i=j=k=0; while(k<n-1){ while(j!=m){ if(xh[i]) j++,t=i; i=(i+1)%n; } xh[t]=0; k++; j=0; } for(i=0; ...
陇川县13079695504: 求c语言的“猴子选大王”代码 - ?
端咏双香: main() { void left(int *p, int n); int i, num[100], n; printf("How many monkey?"); scanf("%d",&n); for(i=0;i<n;i++) num[i]=i+1; left(num, n); for(i=0;i<n;i++) if(num[i]!=0) printf("No.which left last is :%d",num[i]); } void left(int *p, int n) { int i=0, out=0, ...
陇川县13079695504: 如何用c++编写猴子选大王问题 - ?
端咏双香: 这个程序有问题,淘汰数指的是淘汰的位置还是指淘汰的个数?如果是位置,那么就根本找不到王,因为sum 永远也加不到del的数值,countone也不可能小于1,程序会进入死循环的....
陇川县13079695504: (C++编程)猴子选大王?
端咏双香: #include"iostream.h" void main() { int m,n,start,rest,k,a[100]; cout<<"请输入m,n:"<<endl; cin>>m>>n; //将a[0]到a[m-1]标记为1,表示有猴子 for(int i=0;i<m;i++) { a[i]=1; } start=0;//标记当前该从数组的第几个猴子开始数 rest=m;//标记当前剩...