題目:海灘上有一堆桃子,五只猴子來分。第一只猴子把這堆桃子憑據分為五份,多了一個,這只猴子把多的一個扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五只猴子都是這樣做的,問海灘上原來最少有多少個桃子?
算法分析://初始桃子數為sum
第一次:sum=5*x1+1
第二次:4*x1=5*x2+1
第三次:4*x2=5*x3+1
第四次:4*x3=5*x4+1
第五次:4*x4=5*x5+1
第五次分配結束:剩下4*x5個桃子,而x5>=1,故i=4*x5>=4 。每次向上推j=(i/4)*5+1;i=j;每次上推結束后判斷j%4是否等於0,如果為0則繼續上推,否則更新i,直到找到能夠完成五次上推的整數i,最后可以得到最初的桃子數。
C語言程序:
1 #include<stdio.h> 2 int main(int agrc, char*agrv[]) 3 { 4 int i, m, j, k, count; 5 for (i = 4; i<10000; i += 4) 6 /*i為5個猴子分配桃子后最后剩余的桃子,必須為4的倍數,然后以此為基礎, 7 向上推5次,如果剛好能夠推到第五次,則此剩余的桃子數i是滿足條件的,否則換一個 8 剩余的桃子數,直到找到符合條件的最小剩余桃子數*/ 9 { 10 count = 0; 11 m = i; 12 for (k = 0; k<5; k++) 13 { 14 j = i / 4 * 5 + 1; 15 i = j; 16 if (j % 4 == 0) 17 count++; 18 else 19 break; 20 } 21 i = m; 22 if (count == 4) 23 { 24 printf("原來最少的桃子數為:%d\n", j); 25 break; 26 } 27 } 28 system("pause"); 29 return 0; 30 }