海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只
猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了
一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,
问海滩上原来最少有多少个桃子?

这题怎么做?
怎样编程

7楼death_boy的解法很棒,一开始没看懂,尝试理解了一下:

假设最初香蕉的数量为:x,一定存在一个数:y,使得x+y=m,m能够被5整除且减去m/5后,仍旧能被5整除,如此能被整除5次(第5只猴子发现拿走),

m必定是5的倍数,最小是5^5

即 x+y=m=5^5;只要知道y的值,就能知道x的值,即x=5^5-y

m是最小值,x确定的情况下,y要尽可能小,所以y的值从1开始遍历,代码如下

using System;
namespace Fivemonkey
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 5;
            int x;
            Program a = new Program();

            for (int y =1; ; y++)
            {
                x = (int)Math.Pow(n, n) - y;
                if (a.getRight(x))
                {
                    Console.WriteLine(y);
                    Console.WriteLine(x);
                    break;
                }
            }
            Console.ReadKey();
        }

        public bool getRight(int n)//方法:判断这个数是否满足5只猴子的分法
        {  
            int j=0;
            while (n % 5 == 1)
            {
                ++j;
                n = n - n / 5 - 1;
            }
            if (j < 5) { return false; }
            else { return true; }
        }
        
        //下面是一般方法
        /* static void Main(string[] args)
        {
            int n = 5;
            int x;
            Program a = new Program();

            for (int i =1; ; i++)
            {
                x = (int)Math.Pow(n, n) - i;
                if (a.getRight(x))
                {
                    Console.WriteLine(i);
                    Console.WriteLine(x);
                    break;
                }
            }
            Console.ReadKey();*/
        }
    }   
}

输出结果:y=4,x=3121

相对于遍历x(一般方法),遍历y的次数少很多

————————————————————————————

补充:7楼直接得出y=4 ,可以这样思考,只有剩下的香蕉是5的倍数才不余,要保证剩下是5的倍数,必须拿走的也是5的倍数,如果总是余1,也就是一开始就欠4个,导致后面总是需要从5中借4(想象将香蕉5个组成一个单元的铺开)

如此推论余2 欠8 余3欠12 余4欠16

我们甚至可以求任意数猴,扔任意香蕉数的方法

温馨提示:答案为网友推荐,仅供参考
第1个回答  2005-10-29
采用倒推法,再加上整除性,第5只猴子应分得4^4-1=255个桃子,第4只猴子应分得(4^4*5-5+1)/4=4^3*5-1个桃子,第3只猴子应分得(4^3*5*5-5+1)/4=4^2*5^2-1个桃子,第2只猴子应分得(4^2*5^2*5-5+1)/4=4*5^3-1个桃子,第1只猴子应分得(4*5^3*5-5+1)/4=5^4-1个桃子。那么,原来总共有桃子5^4*5-5+1=5^5-4=3121个桃子。

运行示例:
./monkey 5

运行结果:
total=3121

程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char **argv)
{
int monkey_num;
double total;
if (argc < 2)
{
fprintf(stderr, "Usage: %s <monkey_num>\n", argv[0]);
return 1;
}
monkey_num = atoi(argv[1]);
total = pow(monkey_num, monkey_num) - monkey_num + 1;
printf("total=%.16lg\n", total);
return 0;
}
第2个回答  推荐于2018-04-17
告诉楼主一个简单的办法
设原来有:5X+1
第一只拿走后还有:4X(设4X=5Y+1,下同)
第二只拿走后还有:4Y=5Z+1
第三只拿走后还有:4Z=5M+1
第四只拿走后还有:4M=5N+1
则第五只猴拿走的桃子为:N个

楼主可假设N=1,2,3....
直至使得X,Y,Z,M均为整数即符合题意.本回答被网友采纳
第3个回答  2005-11-01
如果多了4个,那么没有桃子被扔入海中,最小的是5^5=3125。所以应该是5^5-4=3121
第4个回答  2005-10-29
5*5*5*5*5 +5*5*5*5 +5*5*5+ 5*5 +5 +1=
你算出来就是结果!
相似回答