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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Stars√永恒 中级黑马   /  2014-2-19 14:59  /  2381 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭
共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?
解方程组
编写程序,采用穷举法求出结果。

评分

参与人数 2技术分 +2 黑马币 +10 收起 理由
滔哥 + 2
何伟超 + 10

查看全部评分

16 个回复

正序浏览
应该是157种
  1. package 问题;

  2. /*
  3. 有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭
  4. 共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?
  5. */
  6. public class TestQuestion {

  7.         /**
  8.          * @param args
  9.          */
  10.         public static final int MAX = 30;

  11.         public static void main(String[] arg) {
  12.                 int x = 0,y = 0,z = 0;//x: 男人  y:女人  z:孩子
  13.                 int cont = 0;//统计合理的方案
  14.                 for (x = 1; x <= 30; x++) {
  15.                         for (y = 1; y <= 30; y++) {
  16.                                 for (z = 1; z < 30; z++) {
  17.                                         if (x * 3 + y * 2 + z == 50) {
  18.                                                 cont++;
  19.                                                 System.out.println("男" + x+" " + "女" + y +" " + "小孩" + z);      
  20.                                         }
  21.                                 }
  22.                         }
  23.                 }
  24.                 System.out.println("共"+cont+"种可能");
  25.         }
  26. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
lei 中级黑马 2014-2-19 22:40:13
15#
  1. /*
  2. 题目:马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭
  3.           共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?
  4.       编写程序,采用穷举法求出结果。

  5. 思路:用穷举法进行计算,就先要将男人女人和孩子进行遍历,可以使用for循环对男人和女人进行双重循环,然后用30减去男人和女人的人数。
  6.           再定义一个if语句用来判断男人*3+女人*2+孩子*1是否等于50.
  7. */

  8. class  Test1
  9. {
  10.         public static void main(String[] args)
  11.         {
  12.                 int max = 30;
  13.                
  14.                 for(int x=1;x<=max;x++)  //对男人进行遍历
  15.                 {
  16.                         for(int y=1;y<=max;y++)        //对女人进行遍历
  17.                         {
  18.                                 int z = max-x-y;        //根据男人和女人人数确定小孩人数
  19.                                
  20.                                 if(x*3+y*2+z == 50)                //用if语句判断男人女人和小孩的人数是否满足条件。
  21.                                
  22.                                         System.out.println("男人"+x+",女人"+y+",儿子"+z);        //如果满足则输出。
  23.                                        
  24.                         }
  25.                 }
  26.         }

  27.        
  28. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
lei 中级黑马 2014-2-19 22:35:26
14#
  1. <blockquote>/*
复制代码
下面是程序运行结果:

QQ图片20140219221926.jpg (45.41 KB, 下载次数: 36)

QQ图片20140219221926.jpg
回复 使用道具 举报
你们的算法算出来的答案为什么就只有几种啊?
我算出有157种答案,上面不是说用穷举法吗?
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int i=0;
  6.                 for(int a=1;a<30;a++){
  7.                         for(int b=1;b<30;b++){
  8.                                 for(int c=1;c<30;c++){
  9.                                         if(50==a*3+b*2+c){
  10.                                                 System.out.println("男人:"+a+"女人:"+b+"小孩:"+c);
  11.                                                 i++;
  12.                                         }
  13.                                 }
  14.                         }
  15.                 }
  16.                 System.out.println(i+"种答案");
  17.         }
  18. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报 1 0
(1)1 2 3的最小公倍数是6

(2)50/6 = 8于2

(3)女人两先令,因此得到结果 8个小孩 8个男人 9个女人
回复 使用道具 举报

恩恩,这样就没问题了:)
回复 使用道具 举报
徐老爹 发表于 2014-2-19 20:59
我刚才验证了一下您的程序,您和一楼的程序结果有一点点区别,少了2个结果,想问下你为什么定义x ...

错了 应该是50/3
回复 使用道具 举报

我刚才验证了一下您的程序,您和一楼的程序结果有一点点区别,少了2个结果,想问下你为什么定义x<=30/3,y<=30/2 ?
回复 使用道具 举报
来学习,占个座。。。
回复 使用道具 举报
e.c 中级黑马 2014-2-19 20:13:15
7#
                for (int x = 1; x <= 50 / 3; x++) {
                        for (int y = 1; y <= (50 - 3 * x) / 2; y++) {
                                int z = 30 - x - y;
                                if ((3 * x + 2 * y + z) == 50) {
                                        System.out.println("男:" + x + "女:" + y + "小孩:" + z);
                                }

                        }
                }
        }

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
/*
采用3重for循环,代码更容易理解些,元方你怎么看?
*/
class Test
{
        Test()
        {
                for (int i = 0;i<30 ;i++ )
                {
                        for (int j = 0;j<30 ;j++ )
                        {
                                for (int k = 0;k<30 ;k++ )
                                        {
                                                if (50==i*3+j*2+k*1)
                                                {
                                                        System.out.println("i="+i+",j="+j+",k="+k);
                                                }
                                        }
                        }
                }
        }
}
class HeiMa
{
        public static void main(String []args)
        {
                Test t = new Test();

        }
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
果断的3重for循环啊!!class Test {         Test()         {                 for (int i = 0;i<30 ;i++ )                 {                         for (int j = 0;j<30 ;j++ )                         {                                 for (int k = 0;k<30 ;k++ )                                         {                                                 if (50==i*3+j*2+k*1)                                                 {                                                         System.out.println("i="+i+",j="+j+",k="+k);                                                 }                                         }                         }                 }         } } class HeiMa  {         public static void main(String []args)         {                 Test t = new Test();          } }

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

回复 使用道具 举报

我给你优化了一下而且你那个结果也不齐全

public class Test2
{
        public static void main(String[] args)
    { for(int x=1; x<=30; x++){
                    for(int y=1;y<=30; y++){
                            int z=30-x-y;
                            if(x*3+y*2+z==50)
                                    System.out.println("男"+x+"女"+y+"小孩"+z);
                            }
                }
            }
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 徐芾清 于 2014-2-19 20:48 编辑

public class Shine01{
        public static void main(String[] args){
                for(int numofman = 1; numofman<=30; numofman++){
                        for(int numofwoman = 1; numofwoman<=30; numofwoman++){
                                for(int numofchild = 1; numofchild<=30; numofchild++){
                                        if(numofman+numofwoman+numofchild==30 && numofman*3+numofwoman*2+numofchild==50)
                                                System.out.println("男人有:"+numofman+",女人有:"+numofwoman+",小孩有:"+numofchild);
                                }
                        }
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
小弟报的今年java基础班,代码不会写,但是思路有了,结果如下。

男人3先令  女人2先令  小孩1先令

(5男人*3先令)+(10女人*2先令)+(15小孩*1先令)=50先令(得出答案是5男人+10女人+15小孩=30人)
希望板主支持下我这种精神,给加点技术分 谢谢。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1 加油!

查看全部评分

回复 使用道具 举报
  1. public class Test2
  2. {
  3.         public static void main(String[] arg){  
  4.                 int x=0;//男人
  5.             int y=0;//女人
  6.             int z=0;//孩子
  7.             for(x=1; x<=30/3; x++){
  8.                     for(y=1;y<=30/2; y++){
  9.                             z=30-x-y;
  10.                             if(x*3+y*2+z==50)
  11.                                     System.out.println("男"+x+"女"+y+"小孩"+z);
  12.                             }
  13.                 }
  14.             }
  15.         }
复制代码

这个怎么样  

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

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