A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田磊阳 金牌黑马   /  2013-4-9 23:41  /  7327 人查看  /  90 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田磊阳 于 2013-4-14 21:36 编辑

[fly]此贴为答题贴,原题地址如下[/fly]



【让技术飞】01期----答题有奖
http://bbs.itheima.com/thread-44933-1-1.html

90 个回复

正序浏览
强大的代码就需要严谨,各位大神好厉害
回复 使用道具 举报
/**
*需求:一个农夫养了一头牛,三年后,这头牛每一年会生出1头牛,生出来的牛三年后,
*又可以每年生出一头牛……问农夫10年后有多少头牛?n年呢?(不考虑其他因素,只考虑此数学问题)
*
* 思路:由题可知分析,第一年,1 一头牛产子第二年1 一头牛产子 第3年为2,两头牛头牛产子
*     由此可知牛的数量是由两个方面决定牛的年龄,牛的原有数量,年数
*     所以可以用一个Map集合,键为牛的名字,值为牛的年龄,遍历判断牛的年龄,判断产子,判读总数
*     
* 步骤:1,建立map集合,新建一个函数用于添加牛的属性,判断产子与否,产子往map集合中添加
*
* */

public class Answer {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
//                定义一集合用于装载所有牛
                Map<String,Integer> cowGate = new TreeMap();
//                放入一条种牛
                cowGate.put("cow1", 1);
               
                int totalYear = 6;
//                在一定年数后得到的牛的数量
                getCowsNumber(totalYear,cowGate);
//                判断牛的数量
                if(cowGate.size()<1){
                        System.out.println("no cow ,how to get cow,my gold?");
                        return;
                }
//                打印输出
                System.out.println(cowGate.size());
                Set<Map.Entry<String, Integer>> cowSet = cowGate.entrySet();
                Iterator<Entry<String, Integer>> it = cowSet.iterator();
                while(it.hasNext()){
                        Entry<String, Integer> entry = it.next();
                        System.out.println(entry.getKey()+" : "+entry.getValue());
                }
               
        }
       
       
        /**
         * descriptor:得到一年后牛的数量
         *
         * @param  
         *                   totalYear          years later to get the cows number
         *        cowGate                  a cow gate to capacity all cow
         *         
         *
         * */
        private static void getCowsNumber(int totalYear,
                        Map<String, Integer> cowGate) {
                // TODO Auto-generated method stub
//                判断牛的数量
                if(cowGate.size()<1){
                        System.out.println("no cow ,how to get cow,my gold?");
                        return;
                }
                int i = 1;
                while(i<=totalYear){
                        i++;
//                        一年后牛的数量
                        cowOfYear(cowGate);
                       
                }
        }

        /**
         * descriptor:得到一年后牛的数量
         *
         * @param  
         *        cowGate  a cow gate to capacity all cow
         *         
         *
         * */
        private static void cowOfYear(Map<String, Integer> cowGate) {
                // TODO Auto-generated method stub
//                用一个新的牛栏装原来的牛,不然迭代就会报异常
                Map<String,Integer> newCowGate =  new TreeMap(cowGate);
                Set<Map.Entry<String, Integer>> newCowSet = newCowGate.entrySet();
                Iterator<Entry<String, Integer>> itNewCowSet = newCowSet.iterator();
                while(itNewCowSet.hasNext()){
                        while(itNewCowSet.hasNext()){
                                Entry<String, Integer> entryNewCowSet = itNewCowSet.next();
//                                判断牛的年龄是否超过3岁,超过牛栏加一条新生牛
                                if(entryNewCowSet.getValue()>=3){
                                        int newCowNum = cowGate.size()+1;
                                        cowGate.put("cow"+newCowNum, 1);
                                }
//                                牛的年龄加一岁
                                cowGate.replace(entryNewCowSet.getKey(), entryNewCowSet.getValue()+1);
                        }
                }
        }

}
回复 使用道具 举报
呵呵!他们写的代码我能看懂了
回复 使用道具 举报
题目在哪啊?
回复 使用道具 举报
通行天下 发表于 2013-4-14 22:28

太谢谢你啦!问一下,啥时候才出题啦?
回复 使用道具 举报
董延京 发表于 2013-4-10 12:56

这个题大一第一次学编程的示例,先入为主的用了这个方法,没有考虑面向对象的设计。答案的错误是因为,我假设第一头是在第一年才有,第四年才能生小牛。所以,我的第十年,就比别人少了一年。将第一个判断改为(i<3)或者计算第十一年的牛数目,就是正确答案:28
回复 使用道具 举报
技术分终于够了,谢谢楼主!!
回复 使用道具 举报
邵彩华 发表于 2013-4-10 08:31
此题,我暂只能提供两种计算方法,大同小异,方法一用的是循环,方法二用的是Math类的数学方法。能力有限, ...

谢谢阳哥! 汗~看错题意了 这两份纯属恩惠啊
回复 使用道具 举报
本帖最后由 通行天下 于 2013-4-14 22:37 编辑
  1. /*

  2. 题目:一个农夫养了一头牛,三年后,这头牛每一年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛……问农夫10年后有多少头牛?n年呢?

  3. (不考虑其他因素,只考虑此数学问题)


  4. */


  5. import java.util.Scanner;

  6. class TestSum
  7. {

  8.         public static void main(String[] args)
  9.         {   

  10.                 Scanner in = new Scanner(System.in);


  11.                 //向系统中输入任意一个年数,并赋值给变量n

  12.                 System.out.println("请输入一个年数:");

  13.                 int n = in.nextInt();


  14.                 //打印输入的年数所对应的牛的总头数

  15.                 System.out.println("到第"+n+"年,总共有牛"+getSum(n)+"头");

  16.         }


  17.         //此方法用来计算所输入年数的总的牛头数

  18.         public static int getSum(int year)

  19.         {

  20.                 //当输入的年数小于零时,返回-1,表示输入有误。

  21.                 if(year<0)

  22.                 {

  23.                         System.out.println("输入的数据不符合要求!");

  24.                         return -1;

  25.                 }


  26.                 //当输入的年数小于或者等于2时,返回1.因为又题意可知,三年以后,才会有新的牛出生;因此,此时牛的总头数为1.

  27.                 else if(year<3)

  28.                         return 1;

  29.                 //下面是年数大于2的情况

  30.                 else
  31.                 {

  32.                         //最开始时,有一头牛,所以总数sum初始化为1

  33.                         int sum = 1;


  34.                         //定义一个数组来存放每一年新出生的牛,因为从第3年开始才有新牛出生,所以此数组中存储的第一个元素是从第3年开始的,

  35.                         //也即数组的长度为year-2(因为数组角标是从0开始的)。

  36.                         int[] arr = new int[year-2];

  37.                         for(int i=0;i<arr.length;i++)

  38.                         {

  39.                                 //因为是每一头牛都在三年后生产一头小牛,并且以后此牛会每一年生一头小牛;故从第3年起,

  40.                                 //每一年出生的小牛数都等于上一年出生的小牛数加上三年前的那一年出生的小牛数

  41.                                 //(如:第七年出生的小牛数=第六年出生的小牛数+第四年出生的小牛数).这一步很关键!!!

  42.                                 if(i>=3)

  43.                                         arr[i] = arr[i-1]+ arr[i-3];


  44.                                 //当年数为3、4、5时,每年只有一头牛出生

  45.                                 else

  46.                                         arr[i]= 1;

  47.                                 //将每一年的牛数叠加起来

  48.                                 sum += arr[i];


  49.                         }

  50.                
  51.                         //返回输入年数所对应的总牛数

  52.                         return sum;

  53.                 }

  54.         }

  55. }

  56. 楼主,麻烦看一下我的对吗?我这也是第10年为28头牛,先谢谢啦!!
复制代码

评分

参与人数 1技术分 +2 收起 理由
田磊阳 + 2

查看全部评分

回复 使用道具 举报
本帖最后由 黑马-陈思源 于 2013-4-14 10:25 编辑

都以图片形式保存。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1 将代码写出最好

查看全部评分

回复 使用道具 举报
import java.util.*;
/*
通过分析得到每头牛每年长一岁又要判断是否能生小牛
我们可以采取面相对象的思想把牛看成对象
那么就想到用集合来操作此对象
最后得到如下代码
*/
class Cow
{       
        int  age=0;
}
class CowDemo
{
        public static void main(String[] args)
        {
                //把牛看成一个对象那么首先建立一个容器存储对象
                ArrayList<Cow> list = new ArrayList<Cow>();
                //最开始有一头牛那么先存一个牛对象到容器
                list.add(new Cow());
                //每增加一年牛的年龄也长一岁那么就要遍历所有的牛对象给它增长年龄而且还要判断是否能生小牛所以在这里用到for循环嵌套
                for (int year=1;year<=10 ;year++ )
                {       
                        //当生一个小牛后就把它存进集合容器那么容器的元素数就是牛的个数
                        int cowNumber = list.size();
                        for (int x=0;x<cowNumber ;x++ )
                        {
                                //根据索引遍历集合
                                Cow c = list.get(x);
                                //过一年牛长一岁
                                c.age= c.age+1;
                                //判断哪些牛能生小牛生一个往容器内存一个
                                if(c.age>=3)
                                        list.add(new Cow());
                        }
                }
                System.out.println("十年后将有【"+list.size()+"】头牛");
        }
}

评分

参与人数 1技术分 +3 收起 理由
田磊阳 + 3

查看全部评分

回复 使用道具 举报
  1. import java.util.ArrayList;
  2. import java.util.List;


  3. public class Cattle {

  4.         //小牛的年龄
  5.         int age=0;
  6.         //是否能生小牛
  7.         public boolean isproduce(){
  8.                 if(age>=3){
  9.                         return true;
  10.                 }else{
  11.                         return false;
  12.                 }
  13.         }
  14.         //生出来的小牛三年后才能再生产,那么age每次加++
  15.         public void addYear(){
  16.                 age++;
  17.         }
  18.         public static void main(String[] args){
  19.                 //一共几年
  20.                 int year=10;
  21.                   List catList = new ArrayList();
  22.                    //农夫的第一头母牛
  23.                   catList.add(new Cattle());
  24.                    //开始计算
  25.                    for(int i=1;i<=year;i++){
  26.                     int calf = catList.size();
  27.                     for(int j = 0; j<calf; j++){
  28.                             Cattle cattle = (Cattle) catList.get(j);
  29.                      //计算年龄 ++一次
  30.                             cattle.addYear();
  31.                      //判断一下是否到了三年能下崽了
  32.                      if(cattle.isproduce()){
  33.                       catList.add(new Cattle());
  34.                      }
  35.                     }
  36.                    }
  37.                    System.out.println("农夫"+year+"年后将有"+catList.size()+"头牛。");
  38.                 }
  39.         }
复制代码

评分

参与人数 1技术分 +3 收起 理由
田磊阳 + 3

查看全部评分

回复 使用道具 举报
本帖最后由 杜鹏飞 于 2013-4-13 18:38 编辑

推导了一个公式,目前尚未发现其他人用此方法.
  1. import java.util.*;
  2.         
  3. public class first {
  4.         private static Scanner in;
  5.         public static void main(String[] args){

  6.                 in = new Scanner(System.in);
  7.                 int N = in.nextInt();//取年数

  8.                 int[] f = new int[]{1,1,1,0};
  9.                
  10.                 for(int n=4;n<=N+1;n++){
  11.                         f[3]=f[0]+f[2];
  12.                         f[0]=f[1];
  13.                         f[1]=f[2];
  14.                         f[2]=f[3];
  15.                 }
  16.                
  17.                 System.out.println(f[3]);//输出答案
  18.         }
  19. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
田磊阳 + 2

查看全部评分

回复 使用道具 举报
本帖最后由 燕国庆 于 2013-4-13 14:23 编辑

public class CountCow {

        /**
         * @param args
         * 一个农夫养了一头牛,三年后,这头牛每一年会生出1头牛,生出来的牛三年后,
         * 又可以每年生出一头牛……问农夫10年后有多少头牛?n年呢?(不考虑其他因素,只考虑此数学问题)


         */
        public static void main(String[] args) {
               
                //自定义几年后
                int years=10;
                //调用求N年后有多少牛的quantity()的方法
                int cattlenum=quantity(years);
                //把N年后牛的总数打印来
                System.out.println(years+"年后牛的总数目为:"+cattlenum);
               

        }
        public static int quantity(int year){
                //定义一个计数器,用来记录牛的总数
                int count=1;
                //根据题意给定循环的条件,进行循环。
                for(int i=4;i<=year;i+=3){
                        //每一次循环条件的满足都是在已有的数量的基础上进行
                        //当前数目的自加。
                        count+=count;

                }
                return count;
               
        }

}

评分

参与人数 1技术分 +2 收起 理由
田磊阳 + 2

查看全部评分

回复 使用道具 举报
wlt 中级黑马 2013-4-12 22:47:27
79#
public class Demo98
{
        static int count = 1; //  计数牛的个数
        //定义两个变量
        private static void feedCow(int year,int age)
{
                year++;
                age++;
                if(year<=10)
                {
                        if(age>=3)
                        {
                                count++;
                                feedCow(year,0);
                        }
                        feedCow(year,age);
                }
}
        public static void main(String[] args)
    {
                new Demo98().feedCow(0, 0);//调用方法
                System.out.println(count);
        }

点评

很好的运用了面向对象的方法  发表于 2013-4-14 19:46

评分

参与人数 1技术分 +3 收起 理由
田磊阳 + 3

查看全部评分

回复 使用道具 举报
发现不对,换了一种思路,再来一次
  1. public class CountBulls {
  2.         public static void main(String[] args){               
  3.                 new CountBulls(0);//调用构造函数传入一个0
  4.                 System.out.println("10年后一共有: " + count + "头牛");//输出最后牛的总数
  5.         }
  6.                
  7.         public static int count = 0;//定义一头牛初始为0,static修饰为了主函数调用方便
  8.         public CountBulls(int year){
  9.                 count++;//累加牛的数量
  10.                 //每过三年才会有新的小牛 第一次生小牛,一共10年
  11.                 for(int i=3+year;i<=10;i++){
  12.                         new CountBulls(i);//函数调用自己无限深入下一代去检查,直到下一代还没有到生小牛的年纪
  13.                 }
  14.         }
  15. }
复制代码

点评

改过就好多了  发表于 2013-4-14 19:50

评分

参与人数 1技术分 +2 收起 理由
田磊阳 + 2

查看全部评分

回复 使用道具 举报
  1. public class Test
  2. {       
  3.         private static  int COUNT=1;

  4.         public static void main(String a[]){
  5.         calve(10);
  6.         outSum();
  7.         }

  8.         public static void calve(int n){
  9.                 for(int i=1;i<=n;i++){
  10.                         if(i>3){
  11.                                 COUNT++;
  12.                                 calve(n-i);
  13.                         }
  14.                 }
  15.         }

  16.         public static void outSum(){
  17.                 System.out.println("牛的头数为:"+COUNT);
  18.         }

  19. }
复制代码
因为版主说3年后,我就从第四年开始算的。没有包括第三年。楼主辛苦了

点评

可尝试面向对象的方法  发表于 2013-4-14 19:47

评分

参与人数 1技术分 +3 收起 理由
田磊阳 + 3

查看全部评分

回复 使用道具 举报
Sword 金牌黑马 2013-4-12 16:21:57
76#
  1. 1递归(结果为28,如果要算n年后的结果,只需将10改为n):

  2. public class Cow {
  3.         static int count = 1;
  4.         private static void feedCow(int year,int age){
  5.                 year++;
  6.                 age++;
  7.                 if(year<=30){
  8.                         if(age>=3){
  9.                                 count++;
  10.                                 feedCow(year,0);
  11.                         }
  12.                         feedCow(year,age);
  13.                 }
  14.         }

  15.         public static void main(String[] args) {
  16.                 new Cow().feedCow(0, 0);
  17.                 System.out.println(count);
  18.         }
  19. }
复制代码
2.面向对象(很经典的思路,结果当然是28,要求n年后,只需将i<10改为i< p>
  1. public class Cow {
  2.         public static int count = 0;
  3.         public Cow(int year){
  4.                 count++;
  5.                 for(int i=3+year;i<=10;i++){
  6.                         new Cow(i);
  7.                 }
  8.         }

  9.         public static void main(String[] args) {
  10.                 new Cow(0);
  11.                 System.out.println(count);
  12.         }
  13. }
复制代码
30年后居然可以生出58425头牛…

点评

可以尝试自己书写代码  发表于 2013-4-14 19:49

评分

参与人数 1技术分 +2 收起 理由
田磊阳 + 2

查看全部评分

回复 使用道具 举报
  1. /*
  2. 题目描述:
  3. 一个农夫养了一头牛,三年后,这头牛每一年会生出1头牛,生出来的牛三年后,
  4. 又可以每年生出一头牛……问农夫10年后有多少头牛?n年呢?(不考虑其他因素,只考虑此数学问题)
  5. */
  6. /*
  7. 思路.
  8. 1.定义一个变量来存贮一共牛的数量 num
  9. 2.因为牛生牛,每次间隔都会有三年.所以在定义一个变量num1
  10. 3.遍历牛.年份减去3就是第一头牛所生的所以小牛.然后小牛生小牛,又是三年后的事.所以用第一批牛的总数减3来当第三批牛的"年"
  11. */

  12. class Demo
  13. {
  14.         public static void main(String[] args)
  15.         {
  16.                 //定义一个cattle函数.往里面扔"年",返回多少牛
  17.                 int n=cattle(9);
  18.                 System.out.println(n);//打印牛
  19.         }
  20.         public static int cattle(int i)
  21.         {       
  22.                 /*
  23.                 定义两个变量,一个为牛的总数.另一个为下批牛的变量
  24.                 */
  25.                 int num1=0;
  26.                 int num=1;
  27.                 for(int x=0;x<=i-3;x++)
  28.                 {
  29.                         num++;
  30.                         if(num==i-3)//当牛的总数加到年减三的时候.就赋值给下批牛的变量.
  31.                         {
  32.                                 num1=num;
  33.                                 num=num+cattle(num1);//使用递归
  34.                         }
  35.                 }               
  36.                 return num;
  37.         }
  38. }
  39. /*
  40. ps:版主出的题目也太绕人了吧....我足足研究了两个小时....主要是考数学啊!!!!
  41. 应该是对的了.....如果哪里不对还请帮忙给我通通哈...谢谢啦.
  42. */
复制代码

未命名.jpg (67.94 KB, 下载次数: 6)

未命名.jpg

点评

还附有图解释,很好  发表于 2013-4-14 19:49

评分

参与人数 1技术分 +4 收起 理由
田磊阳 + 4

查看全部评分

回复 使用道具 举报
12345下一页
您需要登录后才可以回帖 登录 | 加入黑马