1. c语言:所有猴子按1~M 编号围坐一圈,从第p 号开始按顺序1~N 报数,凡报到N 的猴子退出到圈外
http://www.cnblogs.com/EricYang/archive/2009/09/04/1560478.html
这是约瑟夫环的问题,上面有链接。
2. c语言源代码 选猴王问题 急需!!!
#include<早羡stdio.h>
void main()
{
void left(int *p, int n);
int i, num[100], n;
printf("旅陆How many monkey?\n");
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\n",num[i]);
}
void left(int *p, int n)
{
int i=0, out=0, count=0;
while(out<n-1)
{
if(*(p+i)!=0)
count++;
if(count==3)
{
*(p+i)=0;
count=0;
out++;
}
i++;
if(i==n)
i++;
}
}
3. 猴子选王问题-(c语言编程)
这是典型的约瑟夫环的问题
#include <stdio.h>
int main(void)
{
int n=100, m=3, i, s=0;
for (i=2; i<=n; i++)
s=(s+m)%i;
printf ("最后留下的是原来第%d号\n", s+1);
}
4. C语言 约瑟夫问题:编程求输入n,m后,输出最后猴王的编号。
#include<stdio.h>
intLastRemaining(unsignedintn,unsignedintm)
{
inti,last;
if(n<1||m<1)return-1;
扮衫//last表示最后一只猴子(猴大王)在每轮(先倒数第1轮,再求倒数第二帆咐轮,...)中自己的序号
态缺纯//倒数第一轮时只有一只猴子(猴大王),编号为0
last=0;
//i表示倒数第i次排序
for(i=2;i<=n;++i)
{
last=(last+m)%i;
}
returnlast+1;//+1为符合习惯,表示将编号变成从1开始
}
intmain()
{
intn,m;
scanf("%d%d",&n,&m);
printf("%d ",LastRemaining(n,m));
return0;
}
//示例运行结果
F:c_work>a.exe
113
7
5. C语言程序设计,猴子选大王
#include<stdio.h>
#include<stdlib.h>
main()
{ int a[50];
int i,j,M,N,t=0;
printf("input two number.\n");
scanf("%d %d",&N,&M);
for(i=0;i<N;i++)
a[i]=i+1;
for(j=1,i=0;;j++,i++)
{
if(i==N)i=0;
if(a[i]==0){j--;continue;}
if(j%M==0){a[i]=0;t++;}
if(N-t==1)break;
}
for(i=0;i<N;i++)
if(a[i]!=0) printf("猴王是第%d个.\n",a[i]);
system("pause");
}
试试...
6. 智选猴王,求C语言代码,谢谢,问题如下
/*
智选猴王
有一个美丽的传说:“山中有几十只猴子,想用先斗智后斗勇的方法梁哗产生猴王。
斗智是:众猴围成一个圆圈,从某猴开始顺序编号1、2、3、……。筛选三轮。
第一轮从1数到5,凡数到5者后退一步出圈,直至剩下最后一个,就是候选猴。
第二轮,恢复圆圈从1数到7,
第三轮,恢复圆圈从锋渣冲1数到8,都是直至剩下最后一个作候选猴。
斗勇是猴再厮打,能打败另外两只的则成为猴王。
圈子围好银歼后,一只身单力薄的瘦猴子不知何故姗姗来迟,巡视了一会,不声不响地挤进了圈中。
三轮筛选过后,奇迹出现了,瘦猴子三次当选!于是,瘦猴子不战而成了猴王。”
问:
(1) 山中共有多少只猴子?
(2) 瘦猴子为自己选的位置是多少号?
*/
#include<stdio.h>
/*
n : 人数
m : 出圈步长
k : 起使报数位置
当m<n 时,算法的复杂度为O(m);
当m>=n时,算法复杂度为O(n)。
算法描述: http://wenwen.soso.com/z/q32613561.htm
*/
long Josephus(long n,long m,long k)
{
long i,x;
if (m == 1)
{
k = k == 1 ? n : (k + n - 1) % n;
}
else
{
for (i = 1; i <= n; i++)
{
if ((k + m) < i)
{
x = (i - k + 1) / (m - 1) - 1;
if (i + x < n)
{
i = i + x;
k = (k + m * x);
}
else
{
k = k + m * (n - i) ;
i = n;
}
}
k = (k + m - 1) % i + 1;
}
}
//返回最后一人的位置
return k;
}
int main()
{
long a,b,c;
long n;
for(n=10;;n++)
{
a = Josephus(n,5,0);
b = Josephus(n,7,0);
c = Josephus(n,8,0);
if(a==b && b==c)
{
printf("(1) 山中共有 %ld 只猴子。\n",n);
printf("(2) 瘦猴子为自己选的位置是 %ld 号。\n",a+1);
break;
}
}
}
/*
输出结果:
(1) 山中共有 22 只猴子。
(2) 瘦猴子为自己选的位置是 18 号。
*/
7. C++选猴王题目怎么做
一群猴子要选新猴王。新猴王的选择方法是:让M只候选猴子围成一圈,从某位烂悉置起顺序编号为1~M号。从第1号开始报数,每轮从1报到N,凡报到N的猴子即退出圈子,接着又从紧邻的下李迹一只猴子开始重新报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
思路1:
利用数组int n[M],都初始化为1,淘汰的标记为0,往复循环操作,剩下最后一个数组元素1的下标+1即哪历并是答案。
参考代码:
#include <iostream>
using namespace std;
int whoIsMonkeyKing(int,int );
int main()
{
cout<<whoIsMonkeyKing(21,3)<<endl;
return 0;
}
int whoIsMonkeyKing(int m,int n) //m为猴子个数,n为最大报数
{
if(m<1 || n<1)
{
cout<<"输入参数错误"<<endl;
return -1;
}
int *p = new int[m];
int *q = p,M = m;
int res;
for(int i=0; i<m; i++)
{
p[i]=1;
}
while(M!=1)
{
int i=0;
while(i!=n)
{
if(q==p+m)
{
q = p;
}
if(*q++==1)
{
++i;
}
}
*(q-1) = 0;
--M;
}
for(int i=0; i<m; i++)
{
if(*(p+i)==1)
{
res = i+1;
break;
}
else
continue;
}
delete[] p;
return res;
}