當前位置:首頁 » 操作系統 » 猴子演算法

猴子演算法

發布時間: 2022-12-12 04:40:04

A. 猴子排序法的實際意義是什麼

這個演算法突破了排序演算法最優時間復雜度只能是O(NlogN)的限制,但是實際應用不現實。

這種排序被稱為最原始和最低效率的排序演算法,因為它可能讓你永遠無法得到結果。因此在實際中不被使用,只供大家娛樂!

原理:現有一組未排序數據和相同數量的方格,然後依次隨機地取出數據隨機地放入方格中,直到把方格放滿即止。

之所以又被稱為猴子排序,我的猜測是因為。將這種隨機的特性利用猴子來形容,畢竟猴子並不懂數的大小,讓猴子選擇和放置數據肯定就是隨機的了!

這也是排序?不過再看其實它還是能達到我們想要的排序效果的,雖然概率很小(數據比較多的時候)。既然能解決問題,被稱為方法也是無可厚非。

排序演算法的含義:

所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。

排序演算法在很多領域得到相當地重視,尤其是在大量數據的處理方面。一個優秀的演算法可以節省大量的資源。在各個領域中考慮到數據的各種限制和規范,要得到一個符合實際的優秀演算法,得經過大量的推理和分析。



B. java經典演算法題——猴子吃桃

public class Monkey
{
public static void main(String[] args)
{
int sum=0,remain=1;
//每天吃剩的桃子加一個正好是前一天桃子的一半,每天桃子的總數就是前一天剩下桃子的數量
for(int day=9;day>=1;day--)
{
sum=(remain+1)*2;
remain=sum;
System.out.println("第"+day+"天還剩"+remain+"個桃子");
}
System.out.println(sum);
}
}

C. 猴子分桃演算法

暈死,問題都不發,咋個回答?
是不是這個問題:海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子憑據分為五份,多了一個,這只 猴子把多的一個扔入海中,拿走了一份。第二隻猴子把剩下的桃又平均分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,三、第四、第五隻猴子都是這樣做的, 問海灘上原來最少有多少個桃子?

#include "stdio.h"

void main()
{
int i,s,n;//定義s為最初桃子的數量;n為最初桃子數減去1
for(n=5;n<=10000;n+=5)//因為可以被分成5份,n一定是5的倍數。
{
s=n+1;
for(i=1;i<=5;i++)//i用來控制5次循環,即分5次
if(s%5==1)//判斷桃子能否被分5份並餘下一個,成立就開始往下分,
s=(s-1)*4/5;
else
break;//不成立就直接跳出,不用執行後面的循環,即分不下去了
if(i==6)//注意:5次循環之後,i值為6。既然已經分了5次,那麼n就找到了。
{
s=n+1;
printf("海灘上原來最少有%d個桃子\n",s);
break;
}
}
}

D. 猴子過河 java演算法

importjava.util.Arrays;
importjava.util.List;
importjava.util.Stack;

publicclassMonkey{
publicString[]monkeys={"a","b","c","A","B","C"};

Rulerule1=newRule1();

Rulerule2=newRule2();

publicintcount=0;

publicStringBuffersuccess=newStringBuffer(2000);

publicvoidboat(){
Stack<String>left=newStack<String>();
Stack<String>right=newStack<String>();
for(inti=0;i<monkeys.length;i++){
left.add(monkeys[i]);
}
go(left,right,"");
System.out.println("***********************共"+count+"種成功方案***********************");
System.out.println(success.toString());
System.out.println("***********************共"+count+"種成功方案***********************");

}

privatevoidgo(Stack<String>left,Stack<String>right,Strings){
for(inti=0;i<left.size();i++){
Stringmonkey1=left.get(i);
for(intj=i+1;j<left.size();j++){
StringBuffersb=newStringBuffer();
Stringmonkey2=left.get(j);
sb.append(s);
sb.append(monkey1);
sb.append(monkey2);
sb.append("->");
sb.append("");
if((rule1.isCanBoat(monkey1,monkey2,sb))&&(rule2.isCanBoat(monkey1,monkey2,sb))){
Stack<String>nextLeft=newStack<String>();
Stack<String>nextRight=newStack<String>();
nextLeft.addAll(left);
nextRight.addAll(right);
nextLeft.remove(monkey1);
nextLeft.remove(monkey2);

nextRight.push(monkey1);
nextRight.push(monkey2);

if(nextLeft.size()==0){
success.append(sb.toString()+nextLeft.toString()+nextRight.toString());
success.append(" ");
count++;
continue;
}
back(nextLeft,nextRight,sb.toString());
}
}
}

}

privatevoidback(Stack<String>left,Stack<String>right,Strings){
for(inti=0;i<right.size();i++){
Stringmonkey1=right.get(i);
StringBuffersb=newStringBuffer();
sb.append(s);
sb.append(monkey1);
sb.append("<-");
sb.append("");
if(rule2.isCanBoat(monkey1,monkey1,sb)){
Stack<String>nextLeft=newStack<String>();
Stack<String>nextRight=newStack<String>();
nextLeft.addAll(left);
nextRight.addAll(right);
nextLeft.push(monkey1);
nextRight.remove(monkey1);
go(nextLeft,nextRight,sb.toString());
}
}
}

publicstaticvoidmain(String[]args){
Monkeymonkey=newMonkey();
monkey.boat();
}
}

interfaceRule{
booleanisCanBoat(Stringm1,Stringm2,StringBuffersb);
}

classRule1implementsRule{

String[]childMonkeys={"a","b","c"};

String[]monkeys={"A","B","C"};

publicbooleanisCanBoat(Stringm1,Stringm2,StringBuffersb){

if(m1.toLowerCase().equals(m2.toLowerCase())){
returntrue;
}
List<String>childMonkeysList=Arrays.asList(childMonkeys);
List<String>monkeysList=Arrays.asList(monkeys);
if((monkeysList.contains(m1)&&monkeysList.contains(m2))
||(childMonkeysList.contains(m1)&&childMonkeysList.contains(m2))){
returntrue;
}
sb.append("大猴欺負小猴!");
System.out.println(sb.toString());
returnfalse;
}

}

classRule2implementsRule{

String[]smartMonkeys={"A","B","C","a"};

publicbooleanisCanBoat(Stringm1,Stringm2,StringBuffersb){
List<String>smartMonkeysList=Arrays.asList(smartMonkeys);

if(smartMonkeysList.contains(m1)||smartMonkeysList.contains(m2)){
returntrue;
}
sb.append("沒有會劃船的猴子!");
System.out.println(sb.toString());
returnfalse;
}

}

E. 猴子選大王演算法(快 得急)

我用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)+"]的猴子成為大王!");
}
}
}
}

F. 小猴子算術(作文 )

小猴算算術作文

今年小猴拜師學藝,學會了一些數學乘法知識。他想:「這一下朱毛『打』不過我了吧!我一定要報仇雪恨。」於是他向學校走去……終於朱毛出來了。只見小猴雙手叉著腰,氣勢洶洶地說:「朱毛,快點和我比一比。」朱毛說:「比什麼啊?」小猴說:「呵呵,你還真健忘,半年前,我和你比賽算算術我連連敗下陣來,我現在再次向你挑戰。你敢嗎?」朱毛說:「都什麼時候啦!還說比賽,好好,比就比!我們還是去找老黃牛當裁判吧!」他們找到老黃牛,他正在耕地呢!朱毛說:「老黃牛,你給我們當裁判好嗎?」老黃牛說:「好啊,比什麼呀?你們先幫我解決一道難題,再比好嗎?」「好呀!」朱毛說。老黃牛說:「我有一塊地,長40米,寬20米,問我沿著邊緣耕地一圈,一共要走多少米?」小猴忙說:「這好辦,我跑一圈不就知道了嗎?」然後轉身就跑。 不一會小猴就跑回來了,他氣喘吁吁地說:「我知道了,知道了,是120米,對嗎?」老黃牛笑著說:「小猴啊,小猴,人家朱毛早就算出來啦!你是怎麼算的?」小猴說:「我是跑了20米再跑了40米又跑了20米和40米它們加起來不就是120米嗎。」老黃牛說:「朱毛比你演算法好,聽朱毛給你解釋吧!」朱毛說:「先把20米乘2等於40米,然後,把40米乘2等於80米,再把40和80加起來,就等於120米。」小猴這才知道這就是一場比賽。老黃牛說:「還比嗎?」小猴慚愧的說:「這次算我輸了,不比了,可是我下次一定會贏的!」朱毛說:「小猴咱們一起回家吧!」小猴說:「好!」就這樣朱毛和小猴一起回家了!

G. 轉貼:猴子搬香蕉演算法,答案是多少

一隻小猴摘了300個香蕉,需要搬回家,每次最多搬100個。小猴離家100米,它每走1米,都需要吃掉1個香蕉來補充能量,請問它最多能夠搬回家多少個?
先搬100根香蕉到67.5米處放下,吃掉67根,還剩下33根;
把留下的200分別搬到67.5米,總剩下99根;
把這99根香蕉搬回家要吃掉33根,還剩下66根
所以小猴子最多能夠搬回家66個。
找不到最好的答案,還是我的答案正確。

H. 猴子偷桃的問題 演算法

5個猴子摘了一堆桃,第一個猴平均分5份,余出一個,拿走其中一份和多出的一個,第二個猴將剩下的4份平均分成5份,又余出一個.....第5個後又將剩下的4分平均分成5份,多出一個,求最開始至少有多少個桃?(用遞歸演算法)
# include <iostream.h>
int i;
int fentao(int k)
{
if(i==4) return k;
else if(k%5!=1||k%4!=0)
return 0;
else
{
k=k/4*5;
i++;
return fentao(k);
}
}
void main()
{
for(int j=0;j<100000;j++)
{
i=0;
if(fentao(j)!=0)
{
cout<<fentao(j);
break;
}
}
}
看程序應該能明白的吧
實在不好講

I. 一頭大象重5408千克,是猴子208倍,猴子重多少千克,兩種演算法

(1)算術法:
猴子重量=大象重量÷倍數=5408÷208=26千克;
(2)方程法:
設猴子重量為x千克,則有;
208x=5408;
x=5408÷208;
x=26;
所以猴子重26千克

J. 猴子吃桃問題.設計演算法解決

第9天:(1+1)*2=4
第8天:(4+1)*2=10
第7天:(10+1)*2=22
第6天:(22+1)*2=46
第5天:(46+1)*2=94
第4天:(94+1)*2=190
第3天:(190+1)*2=382
第2天:(382+1)*2=766
第1天:(766+1)*2=1534 1534\2+1=768
所以第一天共摘768個桃子。

熱點內容
排序函數c語言 發布:2025-05-15 13:06:28 瀏覽:6
韓服lol掛機腳本 發布:2025-05-15 12:42:56 瀏覽:461
監控存儲伺服器如何調試 發布:2025-05-15 12:36:30 瀏覽:219
一萬級凈化車間有哪些配置 發布:2025-05-15 12:16:41 瀏覽:98
javazip解壓加密 發布:2025-05-15 12:15:02 瀏覽:943
dnf伺服器存放什麼信息 發布:2025-05-15 12:11:07 瀏覽:217
辦公室視頻劇本腳本 發布:2025-05-15 12:03:51 瀏覽:491
編譯失敗什麼意思 發布:2025-05-15 11:58:18 瀏覽:87
lcs腳本官網 發布:2025-05-15 11:56:15 瀏覽:88
三國志戰略版打9級礦什麼配置 發布:2025-05-15 11:41:29 瀏覽:953