1. 親猴子分桃問題的c語言編程拜求!詳加註釋!謝謝!
#include <stdio.h>
int is_over(int total,int t){ if(t==0) return 1;//當t變為了0,說明前面t次分桃均成功,則返回1 total-=1;//多餘的桃子仍向海里 if(total%5!=0)//剩下桃子不能平均分成5份 return 0; if(total%5==0)//剩下桃子可以平均分成5份 return is_over(total-1-((total-1)/5),t-1); /*採用遞歸調用的方法,如果第一隻猴子可以分到桃,則參數變為剩下的桃子和剩下的猴子,按照同樣的方法進行分桃*/}/*用來判斷總共total個桃子,t只猴子,按照題目所述的方式進行分桃,如果能夠分成功,則返回1,如果不能分成功,則返回0 */
int main(){ int peach=1;//peach為桃子的總數量,並對桃子總數設定初值 do{ if(is_over(peach,5)){//當循環到達題目要求的正解時,if括弧內會返回1,此時輸出桃子的總數,並break語句跳出循環 printf("%d",peach); break; } else peach++; }while(1);//無限循環,peach從小到大逐漸增加,只有當得到正確的解答時,循環才會跳出}//最終答案為 3121
2. C語言編程題,關於猴子分桃問題
高質量不允許參考補充內容,這種打回的管理員需要回爐培訓。
3. 猴子分桃問題,c語言,急~~~
答案是:至少剩8188,原來至少84371
/*猴子分桃改版*/
#include <stdio.h>
int main()
{
int previous (int current, int share, int remaining); /*定義分桃函數,current分完剩下數值,share份數,remaining被吃的余數,返回值為分前數目*/
int monkeyNum1=3, monkeyNum2=5; /*兩組猴子數*/
int peachNum, peachNumr; /*桃子的總數和最後剩下的數目*/
int i,j; /*中間變數*/
for (i=1;i<10000;i++)
{
peachNum=i;
for(j=1;j<=monkeyNum2;j++)
{
peachNum=previous(peachNum, monkeyNum2, 1);
if(peachNum==0)
break;
}
if(peachNum==0)
continue;
for(j=1;j<=monkeyNum1;j++)
{
peachNum=previous(peachNum, monkeyNum1, 2);
if(peachNum==0)
break;
}
if(peachNum==0)
continue;
else
break;
}
peachNumr=i;
printf("At last remaining: %d\nNumber of all the peaches: %d\n",peachNumr,peachNum);
return 0;
}
int previous (int current, int share, int remaining)
{
int previousNum;
previousNum=current*share/(share-1)+remaining;
if(previousNum%share!=remaining)
return 0;
return previousNum;
}
4. C語言猴子分桃問題
#include <stdio.h>
void main(){
int i,s,n,k,num;//定義s為最初桃子的數量;num為最初桃子數減去k
scanf("%d%d",&n,&k);
for(num=n;num<=65535;num+=n)//因為可以被分成n份,num一定是n的倍數。
{ s=num+k;
for(i=1;i<=n;i++)//i用來控制n次循環,即分n次
if(s%n==k)//判斷桃子能否被分n份並餘下一個,成立就開始往下分,
s=(s-k)*(n-1)/n;
else
break;//不成立就直接跳出,不用執行後面的循環,即分不下去了
if(i==n+1)//注意:n次循環之後,i值為n+1。既然已經分了n次,那麼num就找到了。
{
s=num+k;
printf("海灘上原來最少有%d個桃子\n",s);
break; }
}}
5. C語言數據結構之猴子分桃問題。
由文件input.txt 給出輸入數據。第1 行中有3 個正整數n,k 和m,分別表示有n 只猴
子,每次最多取k個桃到筐中,每隻猴子最終都分到m個桃子。
«結果輸出:
將分桃過程中每隻猴子離開隊列的次序依次輸出到文件output.txt。
輸入文件示例 輸出文件示例
input.txt output.txt
5 3 4 1 3 5 2
代碼
#include"stdio.h"
#include"malloc.h"
void main()
{
int n,k,m;
int i,j;
int sub=0,p=0,flag=0;
int *queue;
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
scanf("%d %d %d",&n,&k,&m);
queue=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
queue[i]=0;
/*sub是用來存放多餘的桃子。flag是用來控制循環用的。*/
while(flag<n)
{
for(j=0;j<n;j++)
{
if(queue[j]>=m) /*這只猴子已經領滿m個桃子。*/
continue;
else if((queue[j]+p%k+1<m)&&(sub==0))
/*這只猴子還要繼續領取他的桃子。*/
{
queue[j]=queue[j]+p%k+1;
p++;
}
else if((sub==0)&&(queue[j]+p%k+1>=m))
/*這只猴子剛領滿m個桃子。*/
{
sub=queue[j]+(p%k)+1-m;
queue[j]=m;
p++;
flag++;
printf("%d ",j+1);
}
else if((sub+queue[j]<m)&&(sub!=0))
/*這只猴子還要繼續領取他的桃子。*/
{
queue[j]=queue[j]+sub;
sub=0;
}
else if((queue[j]+sub>=m)&&(sub!=0))
/*這只猴子剛領滿m個桃子。*/
{
sub=sub+queue[j]-m;
queue[j]=m;
flag++;
printf("%d ",j+1);
}
}
}
}
6. C語言 猴子分桃問題。求用遞歸函數解
代碼和分析如下:
#include<stdio.h>
int n,k,t=0; // t代表分配的次數,n只猴子,k個桃子
bool fun(int m)
{
if(m<=k) return false; //如果當前猴子可分配的桃子少於k個,返回false
if(m%n != k) return false; //如果當前的桃子%n !=k,返回false
t++; //當前猴子可分配桃子
if(t>=n) return true; //分配了n次,滿足條件退出
if(!fun(m-k-m/n)) return false; // 下一個猴子可以分m-k-m/n只桃子
return true; //以上條件都滿足,返回true
}
int main()
{
scanf("%d%d", &n, &k);
if(n==1) {printf("%d",1+k); return 0;} // 如果只有1隻猴子,直接輸出,退出
for(int i=1;;i++)
{
t = 0; //每次循環重新計數
int m = n*i + k; //不要直接讓m從1開始循環。反正m肯定%n ==k
if(fun(m))
{
printf("%d", m);
break;
}
}
return 0;
}
測了幾組數據,比如2個猴子1個桃子,就是7。上述程序對於只有1個猴子的時候有問題,但是將m只桃子分成1等份剩餘k個這樣是否有意義呢?
如果有的話,那麼如果只有一隻猴子,直接輸出1+k就可以了。
7. c語言:五猴分桃問題
4/5是整型運算,會導致結果為0
於是後續a一直是0
無法退出循環
8. c語言:猴子分桃
呵呵,最近怎麼一直看到猴子分桃。答案是620~
#include <iostream>
using namespace std;
float superMonkey(int n,int n2)
/**參數說明:n是幾只猴子。n2是最後最遲醒來的猴子擁有的桃數,比如在你的題目最遲醒來的猴子最少最少都要有6個桃子,才能分成五份,再吃掉剩下的一個。**/
{
if (n==1) return n2;
float x;
x = (5 * (superMonkey(n-1,n2)+1))/4;
return x;
}
int main(int argc, char *argv[])
{
for(int i=6; i<=300;i++)
{
cout<<superMonkey(5,i)<<"\n";//5隻猴子,為了找出原先最少必須有幾個,用循環求答案直到找到一個整數。
}
cin.get();
}
/**接下來出現的一堆數字就是一開始的桃數。不能有小數點的,所以要找的是第一個出現的整數。我放300次循環因為我稍微試過了,620是原先必須有的最少桃數(第一個出現的整數就是620啊)。你可以稍微改改,放個檢測整數的函數,就不用看到一堆數字了。還可以該題目成10隻猴子什麼的。**/
9. 用C語言編一程序 猴子分桃的問題
摘的數量最少是什麼樣的情況?我想應該滿足:
1,第5隻猴子有桃子吃;
2,第5隻猴子在醒後吃桃子之前把桃子平均分成了5份,而且還多了一個桃子(隱含意義是第5隻猴子吃了2個桃子,剩下4個桃子,這樣才滿足摘的數量最少);
那麼我們就知道了,最後一個猴子(將猴子數量擴展為未知,猴子數為n)醒後還有n+1個桃子;
第n-1個猴子醒後還有n*(n+1)+1個桃子;
第n-2個猴子醒後還有n*(n*(n+1)+1)+1;
以此類推,可由遞歸算出桃子總數
10. C編程:猴子分桃問題
#include<iostream.h>
int main()
{
int m,n,k,r;
cout<<"輸入n和k的值"<<endl;
cin>>n>>k;
for(m=n+n*k;m>=0;m++)
{
while(m%n!=0)
{
m=m-k;
if(m%n==0)
{
cout<<m<<endl;
goto n;}
}}
n:cout<<"最少有"<<m<<"個桃子"<<endl;
system("PAUSE");
} C語言不會,C++寫的