
猴子选大王问题,请用C++语言编写,谢谢!
n个猴子选大王,先从头到尾1至3报数,报到3的猴子退出,报到尾后,再从尾到头1至3报数,报到3的猴子退出,以此类推,当剩下两只猴子时,报1的为大王,请输入数字n,输出当大...
n个猴子选大王,先从头到尾1至3报数,报到3的猴子退出,报到尾后,再从尾到头1至3报数,报到3的猴子退出,以此类推,当剩下两只猴子时,报1的为大王,请输入数字n,输出当大王的猴子的编号。
展开
展开全部
#include<iostream>
using namespace std;
int main()
{
int num[50];
int i,j,k,m,n;
int *p;
cout<<endl<<"请输入总人数:"<<endl;
cin>>n;
p=num;
for(i=0;i<n;i++)
{
*(p+i)=i+1; //以1至n为序,给每个人编号
}
i=0; //i为每次循环时计数变量
k=0; //k为按1 2 3报数时的计数变量
m=0; //m为退出人数
while(m<n-1) //当退出人数比n-1少时(即未退出人数大于1时)执行循环体
{
if(*(p+i)!=0)
{
k++;
}
if(k==3) //将退出人的编号置为0
{
*(p+i)=0;
k=0;
m++;
}
i++;
if(i==n)
{
i=0;//报数到尾后i恢复为0
}
}
while(*p==0)
{
p++;
}
cout<<"最后一个是"<<*p<<" 号!"<<endl;
return 0;
}
展开全部
typedef struct
{
int index;
bool bExit;
}UNIT;
int GetData(int n)
{
UNIT unit;
CArray<UNIT,UNIT&>m_Array;
int nNum=0;
for(int i=0;i<n;i++)
{
unit.index=i+1;
unit.bExit = false;
m_Array.Add(unit);
}
while(m_Array.GetCount()<=2)
{
for(int i=0;i<m_Array.GetCount();i++)
{
if((i+1)%3==0)
m_Array.GetAt(i).bExit= true;
}
for(int i=0;i<m_Array.GetCount();i++)
{
if( m_Array.GetAt(i).bExit)
{
m_Array.RemoveAt(i);
i--;
}
}
nNum=m_Array.GetCount();
for(int i=0;i<nNum;i++)
{
m_Array.Add(m_Arrayn.GetAt(Num-i-1));
m_Array.RemoveAt(Num-i-1);
}
}
return m_Array.GetAt(0).index;
}
应该还有其他的方法吧,感觉这个可能用递归比较简洁
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询