鱼C论坛

 找回密码
 立即注册
查看: 1124|回复: 10

[已解决]猴子分桃子

[复制链接]
发表于 2020-12-25 09:13:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?
最佳答案
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[10];
        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[j] = a;
                        j++;
                        k = 0;
                }
        }
        j = j - 1;
        printf("海滩上至少有桃子:%d\n", f[j]);
}

//                         看到数       拿走数      丢掉数      剩下数
//第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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[10];
        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[j] = a;
                        j++;
                        k = 0;
                }
        }
        j = j - 1;
        printf("海滩上至少有桃子:%d\n", f[j]);
}

//                         看到数       拿走数      丢掉数      剩下数
//第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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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 只桃子。天哪,如今连猴子也个个都是数学家啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-25 20:11:52 | 显示全部楼层
jackz007 发表于 2020-12-25 14:54
忽略了有桃子被拿走的事情了
        多谢指正!

不好意思,我们讨论了一下:猴子是先将桃子平均分为五份,多了一个,才扔入海中的,并不是先扔掉一个再分成5份
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

        先分后扔和先扔后分有区别吗?不都是因为平分 5 份会多出来 1 个吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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                                                                                        ;
                }
        } 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-27 00:42:33 | 显示全部楼层
jackz007 发表于 2020-12-25 21:12
可以分享一下判断最佳答案的理由吗,能不能分享一下你的验证方法,比如,第一只猴子面对最佳答 ...

最佳答案的结果是错误的,楼主就是一脑子浆糊。你就当练练手算了,别深究了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-27 09:40:27 | 显示全部楼层
jackz007 发表于 2020-12-25 21:12
可以分享一下判断最佳答案的理由吗,能不能分享一下你的验证方法,比如,第一只猴子面对最佳答 ...

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

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

现在正是备考的关键时刻,不想多说了,等考完试了或放假了,我多发几个我已经写好了的程序问题上来,报答大家。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-27 11:24:57 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-27 14:31 编辑
乐乐学编程 发表于 2020-12-27 09:40
我的求助求的是渔,而不是鱼。因此,所给出的程序必须要有条理性、逻辑性、可读性,关键之处要有注释,这 ...


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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 07:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表