五只猴子采得一堆桃,它们约定次日早起来分。半夜里,一只猴子偷偷起来,把桃均分成五堆后,发现还多一个,它吃了这桃子,拿走了其中一堆。第二只猴子醒来,又把桃子均分成五堆后,还是多了一个,它也吃了这个桃子,拿走了其中一堆。第三只,第四只,第五只猴子都依次如此做了。问桃子数最少有多少个?
要求:(1)使用面向对象编程!
     (2)使用递归的方法编写!

解决方案 »

  1.   

    5*x2+1=x1
    5*x3+1=x2
    5*x4+1=x3
    5*x5+1=x4
    5*x6+1=x5最小的x6=1
    依次往上,求出x1
      

  2.   

    public static void main(String[] args)
        {
            int i;
            int m;
            int j = 0;
            int k;
            int 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)
                {
                    System.out.println(j);
                    break;
                }
            }
        }
      

  3.   

    5*x2+1=x1
    5*x3+1=x2
    5*x4+1=x3
    5*x5+1=x4
    5*x6+1=x5最小的x6=1
    依次往上,求出x1  同楼上的方法一样
      

  4.   

    5*x2+1=x1
    5*x3+1=x2
    5*x4+1=x3
    5*x5+1=x4
    5*x6+1=x5
    ---------------------
    这种递推式有问题,因为猴子每次都是把桃子分成五堆以后吃掉剩下的一个,然后再拿走一堆,剩下的四堆被后面的猴子重新分。
    所以应当改成
    5*x2/4+1=x1
    5*x3/4+1=x2
    5*x4/4+1=x3
    5*x5/4+1=x4
    5*x6/4+1=x5楼主想要递归的代码,其实只要写一个函数,传入x(i),返回x(i-1)就可以了。
    最终的结果一定要保证x(i)都是整数,所以要放在循环里做。
      

  5.   

    /**
     * 
     */
    package infon.question;/**
     * @author infon
     * 2007-5-16
     */
    public class DividePeach {

    int peachNum;
    int monkeyNum;
    public DividePeach(int monkeyNum){
    this.monkeyNum=monkeyNum;
    }

    public void run(){
    System.out.println("第"+monkeyNum+"只猴子拿1个桃子");
    recursion(1);
    }

    private void recursion(int peach){
    peach=peach*5+1;
    if(1==monkeyNum){
    System.out.println("第"+monkeyNum+"只猴子拿"+peach+"个桃子");
    System.out.println("共有桃子:"+(peach*5+1));
    }
    else{
    --monkeyNum;
    System.out.println("第"+monkeyNum+"只猴子拿"+peach+"个桃子");
    recursion(peach);
    }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new DividePeach(5).run();
    }
    }
    刚写的,还没自己算,不知道对不对运行如果
    第5只猴子拿1个桃子
    第4只猴子拿6个桃子
    第3只猴子拿31个桃子
    第2只猴子拿156个桃子
    第1只猴子拿781个桃子
    第1只猴子拿3906个桃子
    共有桃子:19531
      

  6.   

    public class Test {
      public static int getRest(int num) {
        if ( (num - 1) % 5 != 0) {
          return -1;
        }
        num = (num - 1) * 4 / 5;
        return num;
      }  public static void main(String[] args) {
        for (int sum = 0; true; sum++) {
          int rest = sum;
          for (int j = 0; j < 5; j++) {
            rest = getRest(rest);
            if (rest <= 0) {
              break;
            }
          }
          if (rest > 0) {
            System.out.println(sum);
            break;
          }
        }
      }
    }
      

  7.   

    火星回来看看
    public class Test {
      private static int num = 0;
      private static int getRest(int count) {
        if (count == 0) {
          return 1;
        }
        if ( (num - 1) % 5 != 0) {
          return -1;
        }
        num = (num - 1) * 4 / 5;
        return getRest(count - 1);
      }  public static void main(String[] args) {
        int count = 5;
        for (int sum = 0; true; sum++) {
          num = sum;
          int rest = getRest(count);
          if (rest > 0) {
            System.out.println(sum);
            break;
          }
        }
      }
    }
      

  8.   

    #include<stdio.h> 
    int sub(int n) 

    if(n==1){ 
    static int i=0; 
    do 

    i++; 

    while(i%5!=0); 
    //printf("*%d*",i); 
    return(i+1); 

    else 

    int temp; 
    do 

    temp=sub(n-1); 

    while(temp%4!=0); 
    //printf("*%d*",temp); 
    return(temp/4*5+1); 


    main() 

    int total; 
    total=sub(5); 
    printf(" %d\n",total); 
    } 结果是3121. 
    这是c的,谁改成java的看看,算法与语言没关
      

  9.   

    别着急 让我 慢慢看来...好象看不懂 WUNNAN320高手可以解释一下么?-_-b
      

  10.   

    看来 这道题目 用递归 是有些问题  WUNAN320 也已经做得很不错了 现在 给分 结帖了!!!
    C语言的 我再去研究一下...
      

  11.   

    ■■国产"袋*鼠*egg"web服务器正式发布,免费且开源    在java中间件中大部分人都知道tomcat,一个开源免费的web服务器,不过今天要介绍的是一个国内自主开发的web服务器,它的名字叫“袋*鼠*egg”,同样是开源免费的,但是它所运行的不是JSP脚本语言,而是自己开发的DQM脚本语言,其拥有自己的容器用于执行DQM动态文件,我们称之为DQM容器。DQM很类似与JSP,但是比JSP来的简单,所以如果你会JSP那么只需要稍看DQM就会理解。
       那么这个服务器有什么特点呢?
      1、不需要配置XML文件:以前我们 使用J2EE服务器时都时常需要配置XML文件,而"袋*鼠*egg"则不需要,即使使用MVC结构时也是用动态页面进行逻辑控制。
        2、完善的国际化支持:每个涉及到内容输出或读取的方法都重载了带有字符集的方法,这样就不需要再去编写麻烦的过滤器,只需要简单的提供当前所需要使用的字符集。
      3、有条件的文件输出:BBS的web程序中经常会遇到这样一种情况,允许用户自行上传文件,而上传后的文件必须满足某些条件才能够被访问(读取、下载),这里所指的某些条件例如只有登录用户才能够访问,或者购买了BBS主题后才能访问等等。类似情况在其它web应用中也有很多,那该如何实现这种功能呢?以前我们都是自己写一个servlet进行有条件的文件输出,可是这样会很麻烦,如果要支持断点续传的需要那么自己还要写上一大段程序,要完全符合HTTP协议进行文件输出那么就更加困难了,而在"袋*鼠*egg"只需要简单的使用内置方法即可。
      4、command内置对象:"袋*鼠*egg"有一个全新的内置对象command,用户可以通过此对象来查看或修改服务器当前信息,利用此对象还可以在不停服务器的情况修改服务器的某些设置,比如不中断服务的情况下软重启服务器。
      5、生成静态页面:通 有些情况下,动态页面执行后的内容会长时间不变,但是访问的人却很多,如果生成静态页面那么就可以免去了执行动态文件和读取数据库的开销。"袋*鼠*egg"内置了自动的生成静态页面的功能,只需要简单编程就可以自动生成静态页面了。
      5、编译及隐藏源代码:"袋*鼠*egg"可以关闭自动编译功能,只运行编译后的页面,同时提供了编译整个web应用及隐藏动态页面源代码的功能。
     
      袋*鼠*eggweb服务器的官方网站:http://kweb.go.3322.org
      

  12.   

    /*
     * Alloc.java
     *
     *  五只猴子采得一堆桃,它们约定次日早起来分。半夜里,一只猴子偷偷起来,把桃均分成五堆
     *  后,发现还多一个,它吃了这桃子,拿走了其中一堆。第二只猴子醒来,又把桃子均分成五堆
     *  后,还是多了一个,它也吃了这个桃子,拿走了其中一堆。第三只,第四只,第五只猴子都依
     *  次如此做了。问桃子数最少有多少个?
     *      要求:(1)使用面向对象编程!
     *           (2)使用递归的方法编写!
     *
     * Created on 2007年5月16日, 下午8:36
     *
     * To change this template, choose Tools | Template Manager
     * and open the template in the editor.
     */package CSDN;/**
     *
     * @author perfect
     */
    public class Alloc {
        
        /** Creates a new instance of Alloc */
        public static void main(String [] args){
            int monkeyNum=5,peach=10000;
            
            for(int x=2;x<peach;x++){
                if(recursionFunction(x,monkeyNum)){
                    System.out.println("The minimum number:"+x);
                    break;
                }
            }
            System.out.println("Not found!");  
            }
        }
        
        
        public static boolean recursionFunction(int peach,int monkey){
            if(monkey==0)
                return true;
            
            if((peach-1)%5==0){
                peach=4*(peach-1)/5;
                if(recursionFunction(peach,monkey-1))
                    return true;
                else return false;
            }
            else
                return false;
        }
        
        /*
         public Alloc() {
        }
         **/
        
    }//自己写的,与WUNNAN320兄不谋而合。
      

  13.   

    package com;/**
     * 五只猴子采得一堆桃,它们约定次日早起来分。半夜里,一只猴子偷偷起来,把桃均分成五堆后,
     * 发现还多一个,它吃了这桃子,拿走了其中一堆。第二只猴子醒来,又把桃子均分成五堆后,
     * 还是多了一个,它也吃了这个桃子,拿走了其中一堆。第三只,第四只,第五只猴子都依次如此做了。
     * 问桃子数最少有多少个?
     * 要求:(1)使用面向对象编程! (2)使用递归的方法编写!
     * 
     * @author rainv
     * 
     */
    public class Monkey { private int cycle=0;

    public static void main(String[]args){
    System.out.println(" The result is "+-1%5);
    Monkey m=new Monkey();
    for(int i=1;i>0;i++){
    long rs=m.assign(i, 6, 0);
    if(rs!=0){
    System.out.println("...The min result is "+i);
    break;
    }
    m.cycle=0;
    }

    }
    /**
     * 
     * @param average 可控制枚举范围的桃子总数
     * @param num     猴子的只数
     * @param status  状态参数,替代全局变量
     * @return
     */
    public long assign(long average,int num,int status){

    long mid=average-1;
    if(mid<=1 || (mid%num)!=0){
    if(status==num)
    return average;
    else
        return 0;  
    }


    mid=average-mid/num-1;
    status++;
    // this.cycle++;
    // System.out.println("...The cycle is "+this.cycle);
    return this.assign(mid,num,status);
    }
    }//花了好长时间才想到的,温习了一下递归.
      

  14.   


    long rs=m.assign(i, 6, 0);
    改为
    long rs=m.assign(i, 5, 0);
      

  15.   

    最后一只桃子分成5堆后的每堆数量是n*256-1,其中a是正整数(所以a从小到大依次是255,511,767,……)。那么:
    5a+1=4b
    5b+1=4c
    5c+1=4d
    5d+1=4e
    5e+1=n
    b,c,d分别为最后第二只至第一只猴子每堆分得的数量,n为总数。
      

  16.   

    /**
     * 五只猴子采得一堆桃,它们约定次日早起来分。半夜里,一只猴子偷偷起来,
     * 把桃均分成五堆后,发现还多一个,它吃了这桃子,拿走了其中一堆。
     * 第二只猴子醒来,又把桃子均分成五堆后,还是多了一个,它也吃了这个桃子,
     * 拿走了其中一堆。第三只,第四只,第五只猴子都依次如此做了。
     * 问桃子数最少有多少个?
     * 作者: 詹惠菁
     * 时间:2008-4-14
     *
     */
    import java.util.Scanner;public class FivePApple {
    public static int Slip(int n)
    {
    if (n == 0)
    return 1;
    else
    return 5*Slip(n-1) + 1;
    }
    public static void main(String[] args)
    {
    Scanner in = new Scanner(System.in);
    System.out.println("Please input the number of monkey:");
    int number = in.nextInt();
    System.out.println("Apple is: " + Slip(number));
    }
    }  
      

  17.   

    public class Main { 
    private static int init = 1;
    private static boolean flag = true;
    public static int oneCanGet(int i){
    if(i == 1){
    return init;
    }
    int remain = (oneCanGet(i-1)*5+1);
    if(flag != false && remain%4 != 0){
    flag = false;
    }
    return remain/4;
    }
    public static void main(String args[]) { 
    while(true){
    int one = oneCanGet(5);
    if(flag == true)
    {
    int total = one*5+1;
    System.out.println("Total=" + total);
    break;
    }
    else
    {
    flag = true;
    init += 1;
    }
    }
    }
    }
      

  18.   

    #include <iostream>
    using namespace std;
    int main()
    {
        int p=1;
        for(int i=0;i<5;i++)
        p*=5;
        p-=4;
        cout<<p;
    }
      

  19.   


    public class 猴子分桃2
    { public static void main(String args[])
    { float n=0;
    //总数
    float m1=0,m2=0,m3=0,m4=0,m5=0;
    //每只猴分得的数
    for(int i=0;;i++)
    { n++;
    m1=(n-1)/5;//将所有的桃去掉一个   并分为五份
    m2=(4*m1-1)/5;//将剩下的桃去掉一个  并分为五份
    m3=(4*m2-1)/5;
    m4=(4*m3-1)/5;
    m5=(4*m4-1)/5;
    if((n-1)%5==0&&(4*m1-1)%5==0&&(4*m2-1)%5==0&&(4*m3-1)%5==0&&(4*m4-1)%5==0)
    break;
    }
    System.out.println(n);
    System.out.println(m1);
    System.out.println(m2);
    System.out.println(m3);
    System.out.println(m4);
    System.out.println(m5);
    }
    }