论坛: 编程破解 标题: 五猴分桃 复制本贴地址    
作者: jaychou [jaychou]    论坛用户   登录
大家知道五猴分桃的题目吗?就是说有五只猴子摘完桃子没有马上分,先各自回家休息,第一之猴子醒了之后把桃子分成五份多了一个,他自己把多的那个也拿走了,第二个猴子醒了以后由于不知道第一之后自已经拿走了桃子所以把手下的桃子又分了五分还是多了一个,多的那个有被第二个猴子拿走了,依此类推,第五只猴子把最后的桃子分了五分之后也多拿了一个,文一共有多少个桃子?如何用编程解?拒绝与此贴无关的恢复!

地主 发表时间: 04-09-22 21:04

回复: 286 [unique]   版主   登录
兄弟们,发题的时候请说出自己的想法
这里是讨论的地方,不是给大家作题的地方.
对于一点编程都不会的人,我们是不会给源程序的.

B1层 发表时间: 04-09-23 09:22

回复: yingzike [yingzike]   论坛用户   登录
桃子: x
第一个: a = (x-1)/5
第二个: b = ((x-a) -2)/5
第三个: c = ((x-b-a)-3)/5
第四个: d = ((x-c-b-a)-4)/5
最后一个:e =((x-d-c-b-a)-5)/5

看出递归了吗?
自己代就行了,我不会了

B2层 发表时间: 04-09-23 13:00

回复: jaychou [jaychou]   论坛用户   登录
版猪怎么这么看不起人谁说我不会?递归我明白,可是最后的灯是怎么写?我的思路是把所有猴子拿走的桃子和最后剩下的桃子加起来等于原有的桃子,可是这是个恒等式阿!

B3层 发表时间: 04-09-23 22:03

回复: f [yifanernei]   论坛用户   登录
#include <iostream.h>



void main()
{
int i = 6, k, j = i;

for(;;i+=5, j= i)
{
j--;
j = j*4/5;
for(k = 2; k <= 5; k++)
{
if (j%5 == 1)
{
j--;
j = j*4/5;
}
else break;
}

if (k > 5)
{
cout <<"一共" <<i <<"个桃子" <<endl;
break;
}
}
}


不知道我这么写对不对哦,我算出的得数是3121个,五个猴子不能摘那么多吧!
如果数据结构好的话这种题应该不在话下了,程序写的也一定比这个要好的多了!

B4层 发表时间: 04-09-24 01:38

回复: 286 [unique]   版主   登录
题:大家知道...,依此类推,第五只猴子把最后的桃子分了五分之后也多拿了一个,文一共有多少个桃子?
反问:第五只拿了五分之一并一个后还剩多少了?是拿完了?还是还剩很多个呢?晕~~~~~~~~

二:对于一点编程都不会的人,我们是不会给源程序的.
这样的话是针对你吗?如果是针对你,那只能说明你是我说的那种人。再晕~~~~~~~~~

三:递归我明白,可是最后的灯是怎么写?
灯是什么?三晕~~~~~~~~~~~~~~~~~~~~~~



B5层 发表时间: 04-09-24 08:59

回复: f [yifanernei]   论坛用户   登录
286大哥,这几天是不是有什么心事呀!说话这么冲?
这题应该不用知道还剩多少的,如果知道了,就不用计算了不是?

B6层 发表时间: 04-09-24 16:33

回复: lida1818 [lida1818]   论坛用户   登录
当然不是!题目的条件不足,答案应该是个无穷等差数列。


B7层 发表时间: 04-09-24 19:36

回复: sniper167 [sniper167]   论坛用户   登录
原题的描述有问题,看不大懂。。。
俺E文差,不会汉语也。。。

B8层 发表时间: 04-09-24 21:07

回复: f [yifanernei]   论坛用户   登录
我想应该是找最小解把我是这么做了!
不是等擦把应该!
无比不见了,打字特不爽!


B9层 发表时间: 04-09-25 00:47

回复: bug_me [bug_me]   论坛用户   登录
也不是无穷等差数列
那天看过这帖,那时候没回,说实话是不想回
试问,最后一只猴子拿了几个桃子,如果连这个条件都没有的话
前面的如何推导?又何来之递归呢???
昏~~~~

B10层 发表时间: 04-09-26 02:07

回复: lida1818 [lida1818]   论坛用户   登录
是个等差数列。
如果B4的3121是最小的数,那么
3121
3121+  5*5*5*5*5*1
3121+  5*5*5*5*5*2
。。。。
其差为5*5*5*5*5=(?)多少我就不计算了。不知楼上的为何说不是等差数列?

还有一个,即是如楼主的条件还是可以递归,递归中止的条件是分5次.


[此贴被 烟雨平生(lida1818) 在 09月26日15时03分 编辑过]

B11层 发表时间: 04-09-26 14:50

回复: bug_me [bug_me]   论坛用户   登录
不妨做个假设:
2种情况:(1)最后一只猴子拿了100个桃子
        (2)最后一只猴子拿了200个桃子
倒推出来的当初总桃子数能一样吗?

另外,我们知道:等差数列可以用一次函数来表示,但是此题……



B12层 发表时间: 04-09-26 23:13

回复: lida1818 [lida1818]   论坛用户   登录
引用
----------------------------------------
不妨做个假设:
2种情况:(1)最后一只猴子拿了100个桃子
        (2)最后一只猴子拿了200个桃子
倒推出来的当初总桃子数能一样吗?

另外,我们知道:等差数列可以用一次函数来表示,但是此题……
----------------------------------------

1。这就是一个一元方程
设总数为y,最后一只猴子拿了x个桃子
则可得
    y=3125 *( x/256) -4      ( x/256为整数)

2。最后一只猴子不可能拿100,200个桃子,它拿的必定是256的倍数。

B13层 发表时间: 04-09-27 16:45

回复: f [yifanernei]   论坛用户   登录
同志们,我错了,这的确是个等差数列!
我在外边加了一个循环,得出了五个解:
一共3121个桃子
一共6246个桃子
一共9371个桃子
一共12496个桃子
一共15621个桃子
看来这的确是一个等差的!
我口算了一下,3121是正确的,我的循环又是从5开始以5为步长开始的
这样的话,如果3121正确,应该就是最小的解了!

B14层 发表时间: 04-09-27 21:58

回复: 286 [unique]   版主   登录
各位在作题之前真的分析过题吗?你们连分析一下题对不对就拿来就作,不错才怪.

假设原来有X个.
第一个拿完后剩 (X-1)/5 个.
第二个拿完后剩 ((X-1)/5-1)/5 个.
第三个拿完后剩 (((X-1)/5-1)/5-1)/5 个.
第四个拿完后剩 ((((X-1)/5-1)/5-1)/5-1)/5 个.
第五个拿完后剩 (((((X-1)/5-1)/5-1)/5-1)/5-1)/5 个.

第五个拿完剩多少个呢?有了这个数才能解上面的一元方程呀.设剩Y个.
(((((X-1)/5-1)/5-1)/5-1)/5=Y
可得 X=(((((5Y+1)*5+1)*5+1)*5+1)*5+1
Y=0,X=781
Y=1,X=3905
Y=2,X=7031
Y=3,X=10156
Y=4,X=13281
因此这是一个不完全的等差数列.

实际上,把这群猴子应该换成猪才对!一起摘的时候有几千个,第五只猴子偷拿的时候只剩几个了,还自以为多拿一个沾了便宜,这一点不合上面那群猴子的逻辑。
那么到底应该是多少呢?
答案应该是:
。。。。
。。。。
。。
。。。。。


。。

。。


。。











6个!
6只桃子,第一只分成五份并多一个,于是拿走了两个。
第二个分成五份并多一个,拿走了一个,第三四五如法泡制,哈哈哈哈。。。。。。。


B15层 发表时间: 04-09-28 13:05

回复: lida1818 [lida1818]   论坛用户   登录
我到20cn已经差不多一年了,上面这个贴子是286在这一年里犯最大错误的一个贴子。
顶一下!

B16层 发表时间: 04-09-28 13:12

回复: Raykey [raykey]   论坛用户   登录
我对编程不懂,但是我知道,这个题目如果有答案的话,答案一定不只一个。呵呵

B17层 发表时间: 04-09-28 16:35

回复: bug_me [bug_me]   论坛用户   登录
拿完之后还剩的应该是4/5,不是1/5

[  [  [  [  [x-1]*4/5-1]*4/5-1]*4/5-1]*4/5-1]*4/5=y

y最后最后一只猴子拿完后所分的每一份的桃子个数


[此贴被 寒枫(bug_me) 在 09月29日01时07分 编辑过]

B18层 发表时间: 04-09-28 23:23

回复: lida1818 [lida1818]   论坛用户   登录
不能递归???
我递归给你看看,当然你得用个超级计算机才能完成我的程序。


long x=2 ;//初始值为最后一个H拿的个数,(其实应为256,看我上面的贴子)
long temp ;//用来保存x的初始值
int t=0 ;//分配的次数,当t为5次时,打印总数,x的值增一
void fun(long x,int t);
int main()
{
    fun(x,t);
   
}
void fun(long x,int t)
{
    if(x>4290000000)return;
    if(t==0)temp=x ;//保存x的初值
    if(t<4)
    {
        x=(x-1)*5+1 ;
        if(x%4==0)//如果当次的总数满足被4整除
        {
            x=x/4+1 ;//计算上轮的H分的是数
            fun(x,t+1);
        }
        else
        {
            x=temp+1 ;//否则X的值加一,进行下一个X的推算(这里1改256)
            t=0 ;
            fun(x,t);
        }
    }
    if(t==4)//当t达到5次时,则打印y
    {
        x=(x-1)*5+1 ;
        printf("%ld\n",x);
      /* getch();  */
        x=temp+1 ;//新一轮推算(这里1改256)
        t=0 ;
        fun(x,t);
    }
}
以上三处可改成256

[此贴被 烟雨平生(lida1818) 在 09月29日00时55分 编辑过]

B19层 发表时间: 04-09-29 00:22

回复: bug_me [bug_me]   论坛用户   登录
狂倒,加点注释,累得慌,晚上喝了点,人晕忽忽的

B20层 发表时间: 04-09-29 00:29

回复: lida1818 [lida1818]   论坛用户   登录
哈哈,晕了?

B21层 发表时间: 04-09-29 00:59

回复: bug_me [bug_me]   论坛用户   登录
晚上打了2关,有点昏,这里不适宜聊天,方便的话加我QQ:249999240

我今天得早点去休息了

中秋快乐!

[此贴被 寒枫(bug_me) 在 09月29日01时08分 编辑过]

B22层 发表时间: 04-09-29 01:06

回复: fdgdfghfh [fdgdfghfh]   论坛用户   登录
int f(int a,int b);//a 最后一只猴子分到的桃子数, b 猴子的数量.
void main()
{
for(int k=4;k<10000;k++)
if(f(k,5)>1)

cout<<"如果最后一只猴子分到的桃子数:"<<k<<"    那么桃子一共有"<<f(k,5)<<"只"<<"\n";
}
int f(int a,int b)
{
if(b==1)
return (a-1)*5+1;
else
{if(f(a,b-1)/4*4==f(a,b-1))
return f(a,b-1)+f(a,b-1)/4+1;
return 0;}
}


运行的结果为:

如果最后一只猴子分到的桃子数: 256      那么桃子一共有3121只
如果最后一只猴子分到的桃子数: 512      那么桃子一共有6246只
如果最后一只猴子分到的桃子数: 768      那么桃子一共有9371只
如果最后一只猴子分到的桃子数: 1024      那么桃子一共有12496只
如果最后一只猴子分到的桃子数: 1280      那么桃子一共有15621只
......




[此贴被 fdgdfghfh(fdgdfghfh) 在 09月29日20时56分 编辑过]

B23层 发表时间: 04-09-29 20:49

回复: jaychou [jaychou]   论坛用户   登录
为什么最后的猴子要拿256的倍数?我觉得他只要拿2各就可以了

B24层 发表时间: 04-10-04 16:58

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号