當前位置:首頁 » 編程語言 » 猴子分桃c語言循環
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

猴子分桃c語言循環

發布時間: 2023-01-11 21:16:50

c語言,猴子吃桃子代碼求注釋

哥們好,我來解釋解釋哈
這個程序是倒著分析的:首先說的是s[n]為第n只猴子走後,留給其他每個猴子的桃子的數目。(當然猴子都不知道前面的猴子已經拿過了),所以剩餘桃子是s[5]*4,就是第五隻猴子給其他每隻猴子留下的桃子數目乘以4。
倒著推,第五隻猴子先多吃了一個,再平分5份,並吃掉了自己的一部分,那麼留下的s[5]其實肯定是4的倍數【這段代碼其實可以優化一下】則留下的s[5]*5並加上1,就是第4個猴子留下的桃子總數,然後看下是否是4的倍數,因為這是第四個猴子留下的准備給其他4個猴子的桃子,肯定是4的倍數啦,如果不是就說明錯誤咯,,然後這個數再除以4,再乘以5,再加上1,就是第三隻猴子留下的桃子總數,那肯定也是4的倍數啦。
以此類推,就能推到第一隻猴子時的桃子數什麼的,總數什麼的,都出來啦
如果上面意思弄懂了,現在就說程序本身,先假設s[5]為1,然後看s[5]*5+1【就是第四隻猴子留下的桃子數目】是否能被4整除,如果不能,就直接跳出循環,假設s[5]為2,再看s[5]*5+1能否被4整除,如果能被整除,就得到s[4]的值,【就是你 「s[4]
/=
4;
//想知道這代碼有什麼用」的這段代碼的意思】再乘以5,然後再加上1,就是第三隻猴子留下的桃子數目,再看這個能否被4整除,如果不能,就直接跳出循環,再重新來啦
一直到s[1],最後s[0]就是所謂的總數目啦,
懂了吧,朋友?還沒懂的話
就再繼續探討探討哈
歡迎

② 親猴子分桃問題的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

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

④ c語言:五猴分桃問題

4/5是整型運算,會導致結果為0
於是後續a一直是0
無法退出循環

⑤ 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隻猴子什麼的。**/

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