猴子问题

gangzichh 2005-11-23 10:24:40
有一堆桃子 由5个猴子 第一个猴子把它分成5堆,还剩1个,他拿了一堆,然后把桃子混合,第二个猴子把剩下的,再分5堆,剩1个,他也拿了一堆,其他猴子依次类推,最后剩5堆,求原来的桃子数
...全文
388 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
gangzichh 2005-12-03
  • 打赏
  • 举报
回复
答案是有了,但是我有点晕呀,谁能讲一讲呢
czg516 2005-11-28
  • 打赏
  • 举报
回复
学习,
逆退思想
dlttyy 2005-11-27
  • 打赏
  • 举报
回复
//寒..终于改过来了...见笑啦各位...答案3126..试了可以..:)~

/*有5个猴子分一堆桃子, 第一个猴子把它分成5堆, 还剩1个, 他拿了一堆,
然后把剩下的桃子混合, 第二个猴子把剩下的再分5堆, 剩1个, 他也拿了一堆,
然后把剩下的桃子混合, 其他猴子依次类推,最后第5个猴子拿完后,
剩下的桃子刚好可以分为5堆, 求原来的桃子数 */



#include<iostream>
using namespace std;
int main()
{
int func(int,int);
int taozi;
for(int i=1;i<=10000;i++)
{
if(func(6,5*i)!=0)
{
taozi=func(6,5*i);
cout<<taozi<<endl;
break;
}
}
system("pause");
return 0;
}



int func(int a,int b)
{
int t;
if(a==1) return b;
else t=(func(a-1,b)-1)*5/4+1;
if(t%5==1) return t;
return 0;
}
dlttyy 2005-11-27
  • 打赏
  • 举报
回复
验证了一下.我程序好像答案还是错了~~
dlttyy 2005-11-27
  • 打赏
  • 举报
回复
//初学c++,写了一个下午了.呜呜.不知道还有没有错.或那里还可以改善,请指教咯..


/*有5个猴子分一堆桃子, 第一个猴子把它分成5堆, 还剩1个, 他拿了一堆,
然后把剩下的桃子混合, 第二个猴子把剩下的再分5堆, 剩1个, 他也拿了一堆,
然后把剩下的桃子混合, 其他猴子依次类推,最后第5个猴子拿完后,
剩下的桃子刚好可以分为5堆, 求原来的桃子数 */



#include<iostream>
using namespace std;
int main()
{
int func(int,int);
int taozi;
for(int i=1;i<=10000;i++)
{
if(func(5,5*i)!=0)
{
taozi=func(5,5*i);
cout<<taozi<<endl;
break;
}
}
system("pause");
return 0;
}



int func(int a,int b)
{
int t;
if(a==1) {t=b;return t;}
else t=func(a-1,b)*5/4+1;
if(t%5==1&&t!=1) return t;
return 0;
}
gangzichh 2005-11-25
  • 打赏
  • 举报
回复
这是我的错呀,我没有把题目说清楚的呀
问题1:有5个猴子分一堆桃子, 第一个猴子把它分成5堆, 还剩1个, 他拿了一堆, 然后把剩下的桃子混合, 第二个猴子把剩下的再分5堆, 剩1个, 他也拿了一堆, 然后把剩下的桃子混合, 其他猴子依次类推,最后第5个猴子拿完后, 剩下的桃子刚好可以分为5堆, 求原来的桃子数 )
代码是:
#include <iostream>

int main()
{
int i;
int nsum;
for(i=0; i<100000; i+=5)
{
int j;
nsum = i;
for(j=0; j<5; ++j)
{
nsum = (nsum * 5 - 1);
if(nsum % 4 != 0)
break;
nsum /= 4;
}
if(j==5)
std::cout<<nsum<<std::endl;
}
return 0;
}
要是那个让猴子吃了呢?
那代码就是这个:#include <iostream>

int main()
{
int i;
int nsum;
for(i=0; i<1000000; i+=5)
{
int j;
nsum = i;
for(j=0; j<5; ++j)
{
nsum = nsum * 5;
if(nsum % 4 != 0)
break;
nsum /= 4;
nsum += 1;
}
if(j==5)
std::cout<<nsum<<std::endl;
}
return 0;
}
fiftymetre 2005-11-24
  • 打赏
  • 举报
回复
此为老问题了, 经典c程序100例就有的。嘿嘿。

π萧筱雨 (18803603) 12:19:00
点点
责令你去解猴子问题去
π萧筱雨 (18803603) 12:19:07
http://community.csdn.net/Expert/topic/4414/4414049.xml?temp=.6419947
π萧筱雨 (18803603) 12:19:19
师傅我搞不定了
点雨点(32067090) 12:19:28
。。。。。。。。


多值得偶收藏的一些话哟哈哈。。。。。。。
fiftymetre 2005-11-24
  • 打赏
  • 举报
回复
main()
{int i,m,j,k,count;
for(i=4;i<10000;i+=4)
{ count=0;
m=i;
for(k=0;k<5;k++)
{
 j=i/4*5+1;
 i=j;
 if(j%4==0)
  count++;
 else
  break;
}
 i=m;
 if(count==4)
 {printf("%d\n",count);
  break;}
}
fiftymetre 2005-11-24
  • 打赏
  • 举报
回复
main()
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
 {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
 x2=x1;
 day--;
 }
printf("the total is %d\n",x1);
}
happydivid 2005-11-24
  • 打赏
  • 举报
回复
不对,应该是大于等于5的任意数
happydivid 2005-11-24
  • 打赏
  • 举报
回复
不可能知道有多少桃子,因为这个剩下五堆,五堆的桃子加起来可以为任意数
gangzichh 2005-11-24
  • 打赏
  • 举报
回复
好象是答案不对呀
gangzichh 2005-11-24
  • 打赏
  • 举报
回复
我要是C++的代码的,那个东西,有点多呀,我有点晕的呀
xiaocai0001 2005-11-24
  • 打赏
  • 举报
回复
最后剩余5个是无解的...

我上面的推导还漏了一点

由于每次分法都是整数, 则题意隐含如下两个条件
(A) Y mod 5 = 0
(B) f(0) 为整数


(B) f(0) 为整数
应该改为
(B) f(0), f(1), ..., f(n) 都为整数.
laoren_80 2005-11-24
  • 打赏
  • 举报
回复
应该是最后剩五个吧!!
xiaocai0001 2005-11-24
  • 打赏
  • 举报
回复
原题意理解:
有5个猴子分一堆桃子, 第一个猴子把它分成5堆, 还剩1个, 他拿了一堆, 然后把剩下的桃子混合, 第二个猴子把剩下的再分5堆, 剩1个, 他也拿了一堆, 然后把剩下的桃子混合, 其他猴子依次类推,最后第5个猴子拿完后, 剩下的桃子刚好可以分为5堆, 求原来的桃子数 )

以下根据我上面对题意的理解所给出的解答.

设f(n)表示第n个猴子拿过后剩下的桃总数.
由题意可知f(n) = 4 * (f(n-1) - 1) / 5 + 1
即 f(n)-1 = (f(n-1) - 1) * 4/5 .......(1)

(1)即为一个差分方程.

题意就是已知f(5) = Y, 求f(0) = ?

由(1)差分方程知
f(0) - 1 = (5/4)^n * (f(n) - 1)

将n=5, f(5) = Y 代入得
f(0) = (5/4)^5 * (Y-1) + 1

由于每次分法都是整数, 则题意隐含如下两个条件
(A) Y mod 5 = 0
(B) f(0) 为整数

f(0) = (5/4)^5 * (Y-1) + 1
= 3125 * (Y-1) / 1024 + 1
由f(0)为整数
而3125不能整除1024, 则必有(Y-1)整除1024
即 Y mod 1024 = 1

所以题意化为求如下的不定方程组
(1) Y mod 5 = 0
(2) Y mod 1024 = 1

Y = 5*m = 1024*n+1
即 1024*n - 5*m + 1 = 0

解该一次不定方程, 得:
特解m=205, n = 1
通解 m = 205 + 1024*t , n = 1 + 5*t (t=0, 1, 2, ... )
所以 Y = 5*m = 1025 + 5120*t (t=0, 1, 2, ...)
f(0) = 3126 + 15625*t (t=0, 1, 2, ...)

明显, f(0)有无穷多解, 但不是任意解
min{f(0)} = 3126
满足题意的最小值 f(0) = 3126
dragonzxh 2005-11-24
  • 打赏
  • 举报
回复
冒似钱能C++书上的课后习题...........
cdo 2005-11-24
  • 打赏
  • 举报
回复
5堆应该每堆的数量相同。
yefu2000 2005-11-24
  • 打赏
  • 举报
回复
估计原题是分成数目相同的5堆~
aishuishui021 2005-11-24
  • 打赏
  • 举报
回复
顶原题,估计是说错了吧这个用个递归就可以了!!!
加载更多回复(9)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧