乐乐学编程 发表于 2020-12-25 09:13:34

猴子分桃子

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

风过无痕1989 发表于 2020-12-25 09:20:12

本帖最后由 风过无痕1989 于 2020-12-27 01:12 编辑

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

#include<stdio.h>
main()
{
        int i, j = 0, k = 0, a, b, c, d, e, f;
        for (i = 10000;i > 0;i--)
        {
                a = i;                                 // 第一个猴子看到的桃子数
                if ((a - 1) % 5 == 0)
                {
                        b = 4 * (a - 1) / 5;               // 第二个猴子看到的桃子数
                        if ((b - 1) % 5 == 0)
                        {
                                c = 4 * (b - 1) / 5;             // 第三个猴子看到的桃子数
                                if ((c - 1) % 5 == 0)
                                {
                                        d = 4 * (c - 1) / 5;         // 第四个猴子看到的桃子数
                                        if ((d - 1) % 5 == 0)
                                        {
                                                e = 4 * (d - 1) / 5;   // 第五个猴子看到的桃子数
                                                if ((e - 1) % 5 == 0)
                                                {
                                                        k = 1;
                                                }
                                        }
                                }
                        }
                }
                if (k == 1)
                {
                        f = a;
                        j++;
                        k = 0;
                }
        }
        j = j - 1;
        printf("海滩上至少有桃子:%d\n", f);
}

//                         看到数       拿走数      丢掉数      剩下数
//第1只猴子看的桃子数        3121       624       1          2496
//第2只猴子看的桃子数        2496       499       1          1996
//第3只猴子看的桃子数        1996       399       1          1596
//第4只猴子看的桃子数        1596       319       1          1276
//第5只猴子看的桃子数        1276       255       1          1020

jackz007 发表于 2020-12-25 09:52:30

本帖最后由 jackz007 于 2020-12-25 11:35 编辑

      假设第5只猴子面前是 6 只桃子,于是,它扔掉 1 只,分成了 5 份,拿走了 1 只 . . .
#include <stdio.h>

int main(void)
{
      int i , s                                       ;
      for(s = 1 , i = 0 ; i < 5 ; i ++) s = s * 5 + 1 ;
      printf("%d\n" , s)                              ;
}
      编译、运行实况
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
3906

D:\00.Excise\C>
      答案是,海滩上原来至少有 3906 只桃子。天哪,如今连猴子也个个都是数学家啊!{:5_109:}

hehex 发表于 2020-12-25 12:27:36

本帖最后由 hehex 于 2020-12-25 12:31 编辑

jackz007 发表于 2020-12-25 09:52
假设第5只猴子面前是 6 只桃子,于是,它扔掉 1 只,分成了 5 份,拿走了 1 只 . . .

         ...

你的答案不对。这是个老题了,据说是狄拉克最早提出,在1978年李政道访华时给中科大少年班出的题目。当时没有人能立刻给出答案。附JS 代码,C改吧改吧也差不多。答案是3121
var peaches = 6;
var peach;
var i = 1;

peach = peaches;
while (i <= 5) {

    if (peach % 5 == 1 ) {
      peach = (peach - 1) / 5 * 4;
      i++;
    } else {
      peaches++;
      i = 1;
      peach = peaches;
      
    }
}
console.log(peaches);

jackz007 发表于 2020-12-25 14:54:12

hehex 发表于 2020-12-25 12:27
你的答案不对。这是个老题了,据说是狄拉克最早提出,在1978年李政道访华时给中科大少年班出的题目。当 ...

      忽略了有桃子被拿走的事情了
      多谢指正!
#include <stdio.h>

main()
{
      int d , i , s , s0                                                                        ;
      for(s0 = 1 ; ; s0 ++) {
                for(i = 0 , s = s0 ; i < 5 ; i ++) {
                        if((5 * s + 4) % 4) break                                                   ;
                        else s = (5 * s + 4) / 4                                                    ;
                }
                if(i == 5) break                                                                  ;
      }
      printf("%d\n" , s)                                                                        ;
      for(s0 = s , i = 0 ; i < 5 ; i ++) {
                d = (s0 - 1) / 5                                                                  ;
                s = s0 - 1 - d                                                                      ;
                printf("第 %d 只猴子:%d , 丢 1 , 拿 %d, 剩 %d\n" , i + 1 , s0 , d , s0 - 1 - d);
                s0 = s                                                                              ;
      }
}
      编译、运行实况:
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
3121
第 1 只猴子:3121 , 丢 1 , 拿 624, 剩 2496
第 2 只猴子:2496 , 丢 1 , 拿 499, 剩 1996
第 3 只猴子:1996 , 丢 1 , 拿 399, 剩 1596
第 4 只猴子:1596 , 丢 1 , 拿 319, 剩 1276
第 5 只猴子:1276 , 丢 1 , 拿 255, 剩 1020

D:\0002.Exercise\C>

乐乐学编程 发表于 2020-12-25 20:11:52

jackz007 发表于 2020-12-25 14:54
忽略了有桃子被拿走的事情了
      多谢指正!



不好意思,我们讨论了一下:猴子是先将桃子平均分为五份,多了一个,才扔入海中的,并不是先扔掉一个再分成5份

jackz007 发表于 2020-12-25 20:40:17

乐乐学编程 发表于 2020-12-25 20:11
不好意思,我们讨论了一下:猴子是先将桃子平均分为五份,多了一个,才扔入海中的,并不是先扔掉一个再分 ...

      先分后扔和先扔后分有区别吗?不都是因为平分 5 份会多出来 1 个吗?

jackz007 发表于 2020-12-25 21:12:01

本帖最后由 jackz007 于 2020-12-25 21:16 编辑

乐乐学编程 发表于 2020-12-25 20:11
不好意思,我们讨论了一下:猴子是先将桃子平均分为五份,多了一个,才扔入海中的,并不是先扔掉一个再分 ...

      可以分享一下判断最佳答案的理由吗,能不能分享一下你的验证方法,比如,第一只猴子面对最佳答案 2656 只桃子是怎么取舍的,第 2 ~ 5 只呢?
      我写了一个验证程序,可以验证答案是否正确,楼主不妨一试
#include <stdio.h>

int main(void)
{
      int d , i , s0, s , x                                                                                    ;
      printf("输入桃子总数 : ")                                                                                    ;
      scanf("%d" , & s0)                                                                                           ;
      printf("总数 %d 只桃子,5 只猴子的分法如下 : \n" , s0)                                                       ;
      for(i = 0 ; i < 5 ; i ++) {
                if((s0 - 1) % 5 == 0) {
                        d = (s0 - 1) / 5                                                                           ;
                        s = s0 - 1 - d                                                                               ;
                        printf("第 %d 只猴子有 %d 只桃子,扔掉 1 只,拿走 %d 只,剩下 %d 只\n" , i + 1 , s0 , d , s) ;
                        s0 = s                                                                                       ;
                } else {
                        printf("错误:第 %d 只猴子 , 桃子总数 %d , 无法按规则均分\n" , i + 1 , s0)                   ;
                        break                                                                                        ;
                }
      }
}

hehex 发表于 2020-12-27 00:42:33

jackz007 发表于 2020-12-25 21:12
可以分享一下判断最佳答案的理由吗,能不能分享一下你的验证方法,比如,第一只猴子面对最佳答 ...

最佳答案的结果是错误的,楼主就是一脑子浆糊。你就当练练手算了,别深究了。

乐乐学编程 发表于 2020-12-27 09:40:27

jackz007 发表于 2020-12-25 21:12
可以分享一下判断最佳答案的理由吗,能不能分享一下你的验证方法,比如,第一只猴子面对最佳答 ...

我的求助求的是渔,而不是鱼。因此,所给出的程序必须要有条理性、逻辑性、可读性,关键之处要有注释,这样的程序即便有错,但它让我学习了此类问题编程方法,而不是一个自动编程机器生产出来的代码;

我的求助帖子里只希望看到一段程序,后面的跟帖子,我希望是对第一回帖的评议或修正错误的建议或是直接指出第一回帖某处的错误。而不是你一个程序,他一个程序来抢最佳答案,若是这样,我的最佳答案只会是第一回帖!理由是:我既然来求助,说明我对该问题有所疑惑、困惑,发一个求助帖,却引来了好几段程序,使我原来的困惑变得更加困惑;

现在正是备考的关键时刻,不想多说了,等考完试了或放假了,我多发几个我已经写好了的程序问题上来,报答大家。

jackz007 发表于 2020-12-27 11:24:57

本帖最后由 jackz007 于 2020-12-27 14:31 编辑

乐乐学编程 发表于 2020-12-27 09:40
我的求助求的是渔,而不是鱼。因此,所给出的程序必须要有条理性、逻辑性、可读性,关键之处要有注释,这 ...

      又是 “抢最佳答案” 你这是对别人诚心助你的恶毒侮辱!你发了求助帖,有很多人回帖,有些是因为其它帖子结果错误,有些是展示不同的思路和解题技巧,主观目的和出发点都是希望能够帮助到你,关键是你自己必须要有是非判断能力,是否值得采纳关键要看结果,只有结果正确的代码其编程思想、算法、逻辑都不存在问题,才真正值得学习和借鉴,否则,那就是垃圾,就一文不值。像那种连结果都不正确,编程思想、算法、逻辑肯定存在问题的东西又怎么能拿来学习和借鉴呢?
      明明是自己学业不精,是非不分,不知道谦虚谨慎,反在这里高谈阔论,说三道四,实在是让人不齿!
      好了,不多说了,我算是记住你了,今后保证不再给你添乱了,好自为之吧。
页: [1]
查看完整版本: 猴子分桃子