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;
}