當前位置:首頁 » 編程語言 » 猴子選大王php

猴子選大王php

發布時間: 2022-08-12 10:26:39

『壹』 初一數學題 猴子選大王

排第一位,就永遠不可能報除了1以外的數,排第二位,就永遠不可能報除了2以外的數。前面兩個猴子不動,後面的猴子隨著退出的越來越多總會挨到報3的機會。所以拍第一位的為猴王

『貳』 猴子選大王演算法(快 得急)

我用java寫了一個,也是給人幫忙啦,可以給兄台參考參考,有空的話,給你改個指針版出來
MonkeyNumber.java源程序如下:

package test;

import java.util.Scanner;

/**
* @author Administrator
*
* 有M只猴子圍成一圈,每隻各一個從1到M中的編號,
* 打算從中選出一個大王;經過協商,決定出選大王的規則:從第一個開始循環報數,
* 數到N的猴子出圈,最後剩下來的就是大王。
* 要求:從鍵盤輸入M、N,編程輸出猴子出列的次序並計算哪一個編號的猴子成為大王(用數組實現)。
* 要求程序完整,並且驗證過,
*
*/
public class MonkeyNumber {

/**
* 出圈
* <b>方法描述</b>:第outNo號出圈 <p>
* <b>方法流程</b>:
* <p>
* @param monkey
* @param n
* @return outNo 出圈的索引號
*/
private static int getOut(int[] monkey,int n){
int outNo = -1;
int intValidVoters = getVotersNumber(monkey);

for(int i=0; i<monkey.length; i++){
if(intValidVoters > n){
if(monkey[i]==n%intValidVoters){
outNo = i+1;
monkey[i]=-1;// 去除該位置的值

System.out.print("--編號為["+outNo+"]的猴子出圈!--");

return outNo;
}
}
else if(intValidVoters < n){
if(monkey[i]==(n%intValidVoters==0?intValidVoters:n%intValidVoters)){
outNo = i+1;
monkey[i]=-1;// 去除該位置的值

System.out.print("--編號為["+outNo+"]的猴子出圈!--");

return outNo;
}
}
else if(intValidVoters==n){
if(monkey[i]==n){
outNo = i+1;
monkey[i]=-1;// 去除該位置的值

System.out.print("--編號為["+outNo+"]的猴子出圈!--");

return outNo;
}
}
}

return outNo;
}

/**
* 重新初始化數組
* <b>方法描述</b>:對輸入的數組重新進行賦初值 <p>
* <b>方法流程</b>:
* <p>
* @param monkey
* @param startPos 從startPos位置開始賦初值,startPos索引的數組,其值置為1
*/
private static void reAssign(int[] monkey, int startPos){
int count = 0;
//數組中大於等於位置startPos的有效值的個數
int behindCount = getVotersNumber(monkey, startPos);
//對號碼重新初始化
for(int i=0;i<monkey.length; i++){
int differenceValue = i-startPos+1;
if(monkey[i] != -1){
if(differenceValue < 0){
monkey[i]= ++behindCount;
}
else if(differenceValue >= 0){
monkey[i]= ++count;
}
}
}
}

/**
* <b>方法描述</b>:取得當前有效選民數 <p>
* <b>方法流程</b>:
* <p>
* @param monkey
* @return
*/
private static int getVotersNumber(int[] monkey){
int count = 0;

//計算目前多少個號碼有效
for(int i=0;i<monkey.length; i++){
if(monkey[i] != -1){
count++;
}
}
System.out.print("當前有["+count+"]只猴子參加選舉!");
return count;
}

/**
* <b>方法描述</b>:取得大於等於位置startPos的有效選民數 <p>
* <b>方法流程</b>:
* <p>
* @param monkey
* @return
*/
private static int getVotersNumber(int[] monkey,int startPos){
int count = 0;

//計算目前多少個號碼有效
for(int i=startPos;i<monkey.length; i++){
if(monkey[i] != -1){
count++;
}
}
return count;
}

/**
* <b>方法描述</b>:主程序 <p>
* <b>方法流程</b>:測試
* <p>
* @param args
*/
public static void main(String[] args){
System.out.println("Input:M N ");
Scanner scanner = new Scanner(System.in);
String strM = scanner.next();
String strN = scanner.next();
while (strM == null || !strM.matches("[0-9]+")){
System.out.println("輸入錯誤,您輸入的第一個參數不是數字,請再次輸入:");
scanner = new Scanner(System.in);
strM = scanner.next();
}
while (strN == null || !strN.matches("[0-9]+")){
System.out.println("輸入錯誤,您輸入的第二個參數不是數字,請再次輸入:");
scanner = new Scanner(System.in);
strN = scanner.next();
}

int m = Integer.parseInt(strM);
int n = Integer.parseInt(strN);
System.out.println("當前有::["+m+"]只猴子"+",即將報的數是::["+n+"]");

int monkey[] = new int[m];

//賦初值
for(int i=0; i<m; i++){
monkey[i]=i+1;
}

for(int i=0; i<m-1; i++){

//出圈
int outNum = getOut(monkey,n);
int startPos = -1;
if(outNum==m){
startPos = 0;
}
else{
startPos = outNum;
}
//再次循環賦初值
reAssign(monkey,startPos);
System.out.println();
}

for(int i=0; i<m; i++){
if(monkey[i]!=-1){
System.out.println("Voting Success!!!編號為["+(i+1)+"]的猴子成為大王!");
}
}
}
}

『叄』 數據結構猴子選大王問題

#include <stdio.h>
#include <stdlib.h>
#define n 19
#define m 4

typedef struct monkey
{
int num;
struct monkey *next;
} Monkey,*LINK;

void main()
{
LINK p,head,p2;
int i;
head=p=p2=(LINK)malloc(sizeof(Monkey));//三個指針指向同一塊內存

for(i=1;i<n;i++)
{
p=(LINK)malloc(sizeof(Monkey));
p2->next=p;
p2=p;
}

p2->next=head;//把鏈表的首尾相連
p=head;//p指向了第一個結點

printf("對猴子進行編號!\n");
for(i=1;i<=n;i++)
{
p->num=i;//從第一個結點到最後一個結點依次給猴子編號
printf("%d號猴子:%d\n",p->num,p->num);
p=p->next;
}//循環結束,p指向了最後一個結點

i=0;
p=head;//再把p指向第一個結點

while(1)
{
i++;
printf("%d號猴子報:%d\n",p->num,i);
if(p->next==p)
break;//此為while循環的出口

if(i==m)//if語句中是刪除結點的過程
{
i=0;
printf("%d號猴被淘汰\n",p->num);
printf("\n");
p2->next=p->next;//在此刪除結點p
p=p2->next;//p指向它的下一個結點
continue;
}
else
{
if(i==m-1)
p2=p;//保存將要退出結點的前一個結點(存到p2中)
p=p->next;
}
}

printf("勝出:%d",p->num);//最後剩下的結點就是獲勝的結點

}

這個程序其實就是形成了一個有19個結點的循環鏈表,當碰到m的時候,用這兩句話p2->next=head;p=head刪除當前的結點,然後再繼續判斷。

『肆』 猴子選大王:

有M只猴子圍成一圈,每隻各一個從1到M中的編號,打算從中選出一個大王;經過協商,決定出選大王的規則:從第一個開始循環報數,數到N的猴子出圈,最後剩下來的就是大王。要求:從鍵盤輸入M、N,編程計算哪一個編號的猴子成為大王

#i nclude<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表明還有大王候選人;

while(countOne>1)
{
countOne=0;
for(i=0;i<num;i++)
{
sum+=a[i];
if(sum==del)
sum=a[i]=0; //淘汰倒霉猴子;
countOne+=a[i];
}
}

for(i=0;i<num;i++)
if(a[i]!=0)
return i; //找到幸運猴子編號(從0開始的);
}

void main()
{
int num,del;
cout<<"請輸入猴子總數和淘汰數:";
cin>>num>>del;
cout<<"第"<<choose(num,del)+1<<"個猴子為王!"<<endl;
}

『伍』 新的 猴子選大王 代碼 題目:猴子選大王 功能:設編號為1,2,3,……,n的n(n>0)個猴子按順時針方向圍坐

#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表明還有大王候選人;

while(countOne>1)
{
countOne=0;
for(i=0;i<num;i++)
{
sum+=a[i];
if(sum==del)
sum=a[i]=0; //淘汰倒霉猴子;
countOne+=a[i];
}
}

for(i=0;i<num;i++)
if(a[i]!=0)
return i; //找到幸運猴子編號(從0開始的);
}

void main()
{
int num,del;
cout<<"請輸入猴子總數和淘汰數:";
cin>>num>>del;
cout<<"第"<<choose(num,del)+1<<"個猴子為王!"<<endl;
}

『陸』 猴子選大王演算法

我改好了 ~~~~~

順序表和單鏈表兩種方法都寫好了
注釋寫得很清楚 相信你能看懂 有問題問我
你先運行就知道了

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100

typedef struct Node
{
int data;//存儲猴子編號
struct Node *next;
}*List;

/* 用鏈表來得出大王的序號 */
int LinkedList(int num_monkey,int number);

/* 用順序表來得出大王的序號 */
int SequenceList(int num_monkey,int number);

/* 創建循環單鏈表 */
List CreateList(int n);

void main()
{
int m, n, way, king;
printf("請輸入猴子個數:");
scanf("%d", &n);
printf("請輸入要報的數:");
scanf("%d", &m);

while (1)
{
printf("\n請選擇解決問題的方法:\n");
printf("1.單鏈表\n");
printf("2.順序表\n");
scanf("%d", &way);

if (way == 1)
{
king = LinkedList(n,m);
break;
}
else if (way == 2)
{
king = SequenceList(n,m);
break;
}
else
{
printf("輸入不合法!\n");
}
}
printf("%d號猴子是大王\n", king);
}

/* 創建循環單鏈表 */
List CreateList(int n)
{
int i;
List head, p;
head = (List)malloc(sizeof(struct Node));
head->next = head;
for (i = 1; i < n; ++i)
{
p = (List)malloc(sizeof(struct Node));
p->next = head->next;
head->next = p;
}
p = head;
for (i = 0; i < n; ++i)
{
p->data = i+1;
p = p->next;
}
return head;
}

/* 用鏈表來得出大王的序號 */
int LinkedList(int num_monkey,int number)
{
int i,j;
List head = CreateList(num_monkey);
List tail = head;//用來存儲最後一個節點的地址
List out,p;//out指向要淘汰的節點,p指向其前一個節點

/* 讓tail指向最後一個節點 */
for (i = 1; i < num_monkey; i++)
{
tail = tail->next;
}

/* 淘汰的猴子個數比總個數少1,報數一輪就淘汰一個猴子,所以需要報數的輪數比
猴子總個數少1*/
for( i = 1; i < num_monkey; i++ )
{
p = tail;
/* 讓p指向要淘汰的猴子的前一個 */
for ( j = 1; j < number; j++ )
{
p = p->next;
}
out = p->next;
/* 如果最後一個猴子被淘汰就更新尾節點 */
if (out == tail)
{
tail = p;
}
p->next = out->next;
printf("猴子%d淘汰\n", out->data);
free(out);//刪除被淘汰猴子的節點
}
return p->data;
}

/* 用順序表來得出大王的序號 */
int SequenceList(int num_monkey,int number)
{
/* 用來表示個猴子的信息,如果猴子出局就存儲0,否則存儲1。第一個元素不使用 */
int monkey[MAXSIZE];
/* 用來表示出局的猴子的序號 */
int out = 1;
/* 用來表示當前猴子的個數 */
int num_now = num_monkey;
int i,j;
for (i = 0; i < num_monkey+1; i++)
{ /* 開始將每個元素置1 */
monkey[i] = 1;
}

/* 報數次數比猴子個數少一 */
for (i = 1; i < num_monkey; i++)
{
out = 1;
/* 報數整個過程 */
for (j = 0; j < number; j++)
{
/* 如果序號數大於猴子個數,表示循環了一圈,那麼去掉那個圈數 */
if (out > num_monkey)
out -= num_monkey;

/* 之前已經出局的猴子不參加報數 */
while(monkey[out] == 0)
{
out ++;
/* 如果序號數大於猴子個數,表示循環了一圈,那麼去掉那個圈數 */
if (out > num_monkey)
out -= num_monkey;
}
out++;

}
out--;//報完數後out應該是被淘汰的猴子的下一個,所以要向前移動

monkey[out] = 0;
printf("猴子%d淘汰\n",out);

}
while(monkey[out] == 0)
{
out ++;
/* 如果序號數大於猴子個數,表示循環了一圈,那麼去掉那個圈數 */
if (out > num_monkey)
out -= num_monkey;
}
return out;
}

『柒』 猴子選大王 課程設計

任務:一堆猴子都有編號,編號是1,2,3 ...m ,這群猴子(m個)按照1-m的順序圍坐一圈,從第1開始數,每數到第N個,該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最後一隻猴子,則該猴子為大王。
要求:輸入數據:輸入m,n ,m,n 為整數,n<m
輸出形式:提示按照m個猴子,數n 個數的方法,輸出為大王的猴子是幾號 ,建立一個函數來實現此功能。
#include<stdio.h>
#include<stdlib.h>
typedef struct line
{
int data;
struct line *link;
}cycle;
int count=0;
cycle * creat(int n)
{
cycle * h,*p,*q;
int i;
h=p=(cycle *)malloc(sizeof(cycle));
h->data=1;
for(i=2;i<=n;i++)
{
q=(cycle *)malloc(sizeof(cycle));
q->data=i;
p->link=q;
p=p->link;
}
p->link=h;
return h;
}
cycle * king(cycle * head,int n,int m)
{
int i;
while(count<=n-1)
{
for(i=1;i<m-1;i++)

head=head->link;
head->link=head->link->link;
head=head->link;
count++;

}
return(head);
}
main()
{
int n,m;
cycle *head,*last;
printf("\n\nplease input the monkey number and out number:\n\n");
scanf("%d%d",&n,&m);
head=creat(n);
last=king(head,n,m);
printf("\n\nthe number of the fortunate one is:\n\n ");
printf("%d",last->data);
printf("\n\n");
system("pause");
}
是啊,一樓的說的對啊,這個程序並不難啊。你完全可以自己寫啊。要好好學,不可以辜負了父母對我們的期望啊!

『捌』 php猴子選大王的問題,誰能看看這個遞歸公式的由來,看起來很簡單,但是不理解

這應該是一個約瑟夫環演算法,你可以查查相關文章

『玖』 數據結構課程設計題目:猴子選大王問題

一:實驗內容:
M只猴子要選大王,選舉辦法如下:所有猴子按1,2……n編號圍成一圈,從第一號開始順序1,2……m,凡是報m號的退出圈外,如此循環報數直到圈內只剩一隻猴子時這只猴子就是大王。
二:實驗要求:
利用單向循環鏈表模擬此過程,輸出選出的大王編號。
三:程序的設計思想:
(1) 問題分析:「猴子選大王」問題是約瑟夫環問題的一個特例。由於本題目的數據元素個數不可知,所以可使用鏈表來動態的分配內存空間。而該問題又是一個不斷的循環問題所以用循環鏈表來實現。
(2) 總體設計:首先生成一個空鏈表,並給n個結點分配空間,讓單鏈表的表尾指針指向頭結點則生成一個帶有n個結點的循環單鏈表。再給每隻猴子建立順序的編號。現從第一個結點開始報數,依次順序查找出報數為m的待出列的結點(猴子)通過q->next=p->next刪除該結點後繼續運行否則讓q成為p的前驅指針。最後當p->next==p時停止運行,得到p所指向的結點即為猴子選出大王的編號。
四、源程序

#include <stdio.h>

#include <stdlib.h>

/* 定義鏈表節點類型 */

typedef struct node

{

int data;

struct node *next;

}linklist;

int main()

{

int i, n, k, m, total;

linklist *head, *p, *s, *q;

/* 讀入問題條件 */

printf("Please enter the number of monkeys:");

scanf("%d", &n);

printf("Please enter from the monkeys began to count off the first of several:");

scanf("%d", &k);

printf("Please enter the number out:");

scanf("%d", &m);

/* 創建循環鏈表,頭節點也存信息 */

head = (linklist*) malloc(sizeof(linklist));

p = head;

p->data = 1;

p->next = p;

/* 初始化循環鏈表 */

for (i = 2; i <= n; i++)

{

s = (linklist*) malloc(sizeof(linklist));

s->data = i;

s->next = p->next;

p->next = s;

p = p->next;

}

/* 找到第 k 個節點 */

p = head;

for (i = 1; i < k; i++)

{

p = p->next;

}

/* 保存節點總數 */

total = n;

printf("\nOut of sequence:");

q = head;

/* 只剩一個節點時停止循環 */

while (total != 1)

{

/* 報數過程,p指向要刪除的節點 */

for (i = 1; i < m; i++)

{

p = p->next;

}

/* 列印要刪除的節點序號 */

printf("[%d] ", p->data);

/* q 指向 p 節點的前驅 */

while (q->next != p)

{

q = q->next;

}

/* 刪除 p 節點 */

q->next = p->next;

/* 保存被刪除節點指針 */

s = p;

/* p 指向被刪除節點的後繼 */

p = p->next;

/* 釋放被刪除的節點 */

free(s);

/* 節點個數減一 */

total--;

}

/* 列印最後剩下的節點序號 */

printf("\n\n King of the Monkey is the No. [%d] \n\n", p->data);

free(p);

system("pause");

return 0;

}

熱點內容
垃圾壓縮價格 發布:2025-01-20 22:14:05 瀏覽:421
溫十系統如何看處理器配置 發布:2025-01-20 21:59:47 瀏覽:302
米號源碼 發布:2025-01-20 21:55:30 瀏覽:893
電信四川dns伺服器ip 發布:2025-01-20 21:54:51 瀏覽:92
電腦彈出腳本錯誤還能繼續使用嗎 發布:2025-01-20 21:42:29 瀏覽:586
安卓私密照片在哪裡 發布:2025-01-20 21:41:05 瀏覽:5
同濟復試編譯原理 發布:2025-01-20 21:33:54 瀏覽:310
c語言判斷字母 發布:2025-01-20 21:31:09 瀏覽:424
ftp伺服器搭建linux 發布:2025-01-20 21:26:05 瀏覽:335
安卓手機瀏覽器如何翻譯英文網頁 發布:2025-01-20 21:21:01 瀏覽:423