力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks
近日老吴把他读小学的儿子的一道题拿给几个兄弟做,推来推去煞是麻烦。无奈用程序暴力破解之。

话说有五个小矮人上山摘野果,摘回来后平均分,可是怎么也分不下去.因为分不平均.到了晚上,一个小矮人爬起来,从里面扔了一个,刚好能平均分成五份.然后他把自己的那份藏起来,就睡觉去了.第二个小矮个也爬了起来,也把果子扔了一个后刚好分成5份,他也把自己那份藏了起来.然后睡觉,余下3 个小矮人都是这样做的,过程完全一样. 请问,最初这堆果子至少有多少个?

 

#include <iostream>

#define BOY_COUNT (5)

bool gotByOneBoy(int& nTotal)
{
   
--nTotal; // throw one
   if(nTotal%5 != 0)
      
return false;

   nTotal 
-= nTotal/5// hide his
   
   
return true;
}


int _tmain(int argc, _TCHAR* argv[])
{

   
int n = 100;
   
for(; n<10000++n)
   
{

      
bool bFind = true;
      
int nCur = n;
      std::cout 
<< nCur << std::endl;

      
for(int nBoy=1; nBoy<=BOY_COUNT; ++nBoy)
      
{
         bFind 
= bFind && gotByOneBoy(nCur);
      }



      
if(bFind)
      
{
         std::cout 
<<  "This is the result: " << n << std::endl;
         
break;
      }

   }


   
char ch;
   std::cin 
>> ch;
    
return 0;
}
posted on 2007-06-25 18:07 力为 阅读(2828) 评论(15)  编辑 收藏 引用 所属分类: Tools

评论

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-06-25 20:35 小不点
不是吧,C语言课程里有相同的题目!

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

  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-06-25 21:08 xlander
倒着推啊。
题目问的是:最少有多少个?
  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-06-25 21:09 小不点
我不知道 我的方法对吗?自己当时做的.
顺便帮我修改下好了,呵呵,谢谢!
#include <iostream>
using namespace std;

int main()
{
int total = 0;
int i = 0;

for(total = 1 ; total < 10000; total++)
{
for(; i < 5; i++)
{
if((total - 1) % 5 == 0)
{
total = (total-1)/5;
}
else
{
break;
}
}

if(i == 5)
{
for(i = 0; i < 5; i++)
{
total = total * 5+1;
}
cout << "The least total is : " << total << endl;
break;
}
}

return 0;
}  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-06-25 22:57 力为
结果是 3121 就对了 :)  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-06-26 09:26 Rocky
总数=5*5*5*5*5 * x + 5*5*5*5 + 5*5*5 + 5*5 + 5 + 1
当x取1时总数最小,即3906个。  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-06-26 12:16 闲耘
see http://blog.xianyun.org/2007/06/cpp-5.html

int getTotal(){
int total = 1; // 设初始野果总数1个
while (true){
int _t = total;
for (int i = 1; i <= 5; i++){
if ((_t - 1) % 5 == 0){ // 条件:扔掉1个能够5等分
_t = (_t - 1) / 5 * 4; // 第i个矮人拿走1/5后剩下的继续循环
if (i == 5){ // 如果5个矮人都拿到野果
return total;
}
}
}
total ++; // 不满足则野果总数加1
}
}

输出:3121  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-07-01 17:45 s
5+1
30+1
155+1
780+1
3905+1
3906

  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-08-21 17:39 van
30个藏起来一份就是24,扔掉一个怎么会可以分成5份呢..  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-09-03 16:56 haha
怎么会这样的答案 我感觉不对啊 不就是逆推吗?

//4 3 2 1 0
#define M 5
#define N 1
int main(void)
{

int i ;
int sum=N;
for(i=0;i<M ; i++)
{
sum = sum*5 +1;
}
cout<<sum<<endl;

return 0;
}
3906个?!?  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-10-08 00:22 biogerm
T = 5(5(5(5(5n+1)+1)+1)+1)+1

n = 1

T = 3906  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-10-08 10:06 Icat
写了两个凑热闹,第一个把For做的事情手动换算了
第二个假装可以自定义数量,其实马上就溢出........
1.
#include <iostream>
using namespace std;
int main()
{
unsigned long x=0;//总数为X*5+1
while((((x*5+1)*256-2101))%(5*625))
{
x+=1;
}
cout<<x*5+1<<endl;
}
2.
#include <iostream>
using namespace std;
int main()
{
unsigned long lTotal=1;
unsigned long x=1;
int iMonkey=5;
//cin>>iMonkey;
bool bOK=false;
do
{
lTotal=x*iMonkey+1;
for(int i=1;i<iMonkey;++i)
{
lTotal=(lTotal+1)*(iMonkey)/(iMonkey-1);
if((lTotal-1)%(iMonkey))
break;
else
if(i==(iMonkey-1))bOK=true;
}
++x;

}while(!bOK);
cout<<y<<endl;
}

3121

楼上几位的3906,思路差不多,但留下的是4/5~
  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2007-10-08 21:04 Bill Gates
没有想到这个小题可以盖到如此高的楼~~  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2010-04-08 21:55 看看哪个方法好一点
#include <iostream>

bool test(int total, int level)
{
if (level==0)
return true;

if ((total-1)%5!=0)
return false;

total=(total-1)/5 *4;
return test(total,level-1);
}

bool test2(int iGet,int level,int& beforGet)
{
beforGet=iGet*5+1;
if (level==5)
return true;

if ((beforGet%4)!=0)
return false;

iGet=beforGet/4;
return test2(iGet,level+1,beforGet);
}

int main(int argc,char*argv[])
{
int i=1;
int total;
for (;i<10000 ;++i)
{
if (test2(i,1,total))
{
std::cout<<total<<std::endl;
// break;
}
}
for (i=0;i<10000 ;++i)
{
if (test(i,5))
{
std::cout<<i<<std::endl;
// break;
}
}

return 0;
}
  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2010-10-17 21:04 666
在森林里住着五个小矮人,一天他们从山上采来一堆野果,可怎么也分不公平,就都去睡觉了。到了半夜,有一个小矮人偷偷地起来,在这堆野果里拿出一个扔了,剩下的野果正好可分成5等份,他拿了其中的一分藏了起来,又睡觉去了。接着,第二个小矮人也起来了,也扔了一个野果。又恰好分成五等份,也拿了其中一份藏了起来,又去睡觉了。以后另外3人也一一照样扔掉了一个野果,还能分成5等份......原来这堆野果至少有多少个呢?李永莉你好:我来还原一下有3121个野果,第一个人去分时剩(3121-1)×4÷5=2496 第二个人去分时剩(2496-1)×4÷5=1996 第三个人去分时剩(1996-1)×4÷5=1596 第四个人去分时剩(1596-1)×4÷5=1276 第五个人去分时拿走了(1276-1)÷5=255 谢谢你

  回复  更多评论
  

# re: 五个小矮人分桃子-一道小学生的作业题目 2010-12-06 16:49 wu4long
晕了,难道不能先计算他们的公式.然后简单迭代一下.后面就好算了.
设总数为a, 第一次为a1, 第二次a2,依次类推,最后一个小猴子藏起来的为a5.

a1 = (a-1)/5
a2 = (4a1 -1)/5
a3 = (4a2 -1)/5
a4 = (4a3-1)/5
a5 = (4a4-1)/5

a = a1 + a2 + a3 + a4 + a5 + 5 + 4a5
迭代: 算得
a = 12 a5 + 8 + 53(a5 + 1)/256

明显 53 为素数, 所以 必然 a5 = 256* n - 1. (n 为自然数)

这时,这段程序就很简单了. 呵呵
a5 = 256* 1 -1 = 255
a = 12 * a5 + 8 + 53(a5+1)/256 = 3121.


  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理