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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

杨庆雷 发表于 2014-4-14 10:10
如果 用空瓶子换饮料喝  那么两个空瓶子就能会多出一瓶饮料(原本有两个瓶子,向老板借一瓶饮料,喝完刚好三个 ...

这思路,我去绝了!但是就不知道老板会不会借给你
回复 使用道具 举报
倪大大 发表于 2014-6-19 21:51
才做完这个题..
* 28个人连续买可乐,每瓶可乐产生一个瓶盖
         * 每个人在买可乐之前都判断现有瓶盖是否满足 ...

啥玩意啊 我去 代码不全?
回复 使用道具 举报
安茹黑马 发表于 2014-8-2 16:57
太赞了,代码简单而且好理解

http://bbs.itheima.com/forum.php ... p;extra=#pid1020922
我刚刚学习过的一个,感觉还可以...
回复 使用道具 举报
我觉得这个题是有个bug的,按照生活逻辑来生成数学逻辑是不合理的,如果我是老板,你给我两瓶盖,我是不借给你第三个瓶盖的,按照小学数奥,为了发散思维,是可以借的。但是数学逻辑结构应该严谨。没有借不借的可能性,只有不借。如果我做这题我会先把判断逻辑确定了再写,当然也可以分两种方式来写,假设以3个盖换一瓶为准,给我俩盖不借第三瓶。会出现9个人得买7瓶,10个人还得买7瓶的现象,但是这更符合生活逻辑,毕竟规则是三个瓶盖换一瓶,而不是两个瓶盖换一瓶。
回复 使用道具 举报
倪大大 发表于 2014-6-19 21:51
才做完这个题..
* 28个人连续买可乐,每瓶可乐产生一个瓶盖
         * 每个人在买可乐之前都判断现有瓶盖是否满足 ...

这种做法感觉很简洁易懂:handshake
回复 使用道具 举报
杨庆雷 发表于 2014-4-14 10:10
如果 用空瓶子换饮料喝  那么两个空瓶子就能会多出一瓶饮料(原本有两个瓶子,向老板借一瓶饮料,喝完刚好三个 ...

应该为x=int((2/3)*(n-1)) +1

   1+x+x/2=n  --->x+x/2=n-1
回复 使用道具 举报
倪大大 发表于 2014-6-19 21:58
你这思想做不对吧, 你这个就可以等同于 3个人一组,一组只用买两瓶, 需要的瓶数就是 (人数/3)*2+人数%3;
  ...

他忘了总数已经买了一瓶了

应该为x=int((2/3)*(n-1)) +1

   1+x+x/2=n  --->x+x/2=n-1
回复 使用道具 举报
杰克船长 发表于 2014-10-16 11:12
我觉得这个题是有个bug的,按照生活逻辑来生成数学逻辑是不合理的,如果我是老板,你给我两瓶盖,我是不借 ...

瓶盖不是借的      是换来的可乐的瓶盖      买2瓶+前面换的可乐的盖子=1可乐+盖子   循环下去
回复 使用道具 举报
哈哈编程真是是比较有意识
回复 使用道具 举报
谢谢分享!
回复 使用道具 举报
Termy 初级黑马 2014-11-28 10:10:21
31#
  1. /*
  2. 23、 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?
  3.         (需写出分析思路)
  4. 思路:
  5.         3个盖子换一瓶,相当于2个盖子换一瓶没有盖子的,设需要买x瓶可乐,既x+x/2≥28,既x≥56/3,取整,得x=19。
  6.         但存在一用情况:最后只剩两个盖子,是换不了可乐的,所以要求x+x/2>28,没有等于。

  7. */
  8. class Test23
  9. {
  10.         public static void main(String[] args)
  11.         {
  12.                 int nPerson=50;
  13.                 int nCaloNum;
  14.                 if(nPerson>3)
  15.                 {
  16.                         nCaloNum=(nPerson*2)/3+1;
  17.                         System.out.println("需要购买瓶数:"+nCaloNum);
  18.                 }
  19.                 else
  20.                 {
  21.                         nCaloNum=nPerson;
  22.                         System.out.println("需要购买瓶数:"+nCaloNum);
  23.                 }
  24.                
  25.         }
  26. }
复制代码
回复 使用道具 举报
Termy 初级黑马 2014-11-28 10:12:41
32#
回复 使用道具 举报
刚看了这道题,借鉴一下
回复 使用道具 举报
学习学习!
回复 使用道具 举报
/*
28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)

*/

import java.util.Scanner;// 导包;
class  Kele
{
        public static void main(String[] args)
        {
                Scanner sc = new Scanner(System.in);//使用键盘录入法
                System.out.print("请输入人数:");
                int a = sc.nextInt();//调用方法获取int类型数据
               
                buyCoke(a);
        }
        public static void buyCoke(int a)
        {
               
                int coke=0;// 可乐兑换总数
                int sum=0;//可乐兑换和购买总数
                int x=1;//购买可乐数
                String m;//定义 String 类型变量m,接收字符串数据。
                for(;x<=a;x++)//遍历1~50个人数
                {
                        if (x==3)// 由于三瓶可换一瓶,第一瓶兑换需要三个盖子,后面每买两瓶就能换一个(兑换后瓶盖+1)
                        {
                                coke++;//兑换可乐数+1
                        }
                        else if (x>3 & (x-3)%2==0)//当x>3时(第一瓶兑换过后),每买两瓶换一个(即 (x-3)%2==0) 这时可乐兑换数+1
                        {
                                coke++;
                        }
                sum=coke+x;// 用 sum 记录所买可乐瓶数和所换的可乐瓶数的总和;
                        if (sum>=a)// 当可乐的总瓶数满足总人数时(即 sum>=50)跳出循环体
                                break;
                }
                m="所需购买可乐瓶数为:";
                System.out.println(m+x);//输出可乐所购买的瓶数 x ;
        }
}
回复 使用道具 举报

这个方法还是不对,当人数为3,6,9。。时都不对
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
/*
* 需求: 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?
* 假如是50人,又需要买多少瓶可乐?(需写出分析思路)
* 思路:1,这个程序最重要的是分清可乐的瓶数和人数的关系,要求可乐的瓶数与人数的关系是相等的。
*                 2,可乐的瓶数来自于购买的可乐,和喝下可乐留下的盖子3换1获得的。
* 步骤:1,从键盘输入要喝可乐的人数。
*                 2,设置一个While循环里面有三个变量gouMai代表买的可乐数,pingGai代表瓶盖数,keLe代表可乐的总数。
*       当购买一瓶,gouMai++,pingGai++,keLe++。
*      3,当pingGai的个数达到3的倍数的时候换取一个可乐,keLe++,把瓶盖数置为1
*      4,需要注意一点,因为在进行一次循环的过程中,keLe++可能进行两次所以我们在进行每次keLe++的时候判断它是否和人数相等。
*/

package com.itheima;
import java.util.Scanner;

public class Test10 {
        public static void main(String[] args) {
                 Scanner input = null; //键盘录入
                 
                 try{
                         input = new Scanner(System.in);
                         System.out.println("请输入有多少个人喝可乐:");
                         
                        int renShu = input.nextInt();
                        int num =keleNum(renShu);
                         System.out.println("需要"+num+"瓶可乐才够"+renShu+"个人喝");
                 }catch(Exception e) {
                         System.out.println("输入非法,请输入数字");
                 }
                 finally
         {
                 try
                 {
                         if (input != null)
                                 input.close();
                 } catch (Exception e2)
                 {
                         System.out.println("关闭流失败");  
                 }
         }
        }
       
        private static int keleNum(int i) {
                // TODO Auto-generated method stub
                 
                 int keLe = 0,pingGai = 0,gouMai = 0;
                 while (keLe!= i) {
                       
                       
                        gouMai ++;
                        keLe++;
                        if(keLe == i)
                                break;
                        pingGai++;
                        if(pingGai%3==0){
                                pingGai = 1;
                                keLe++;
                                if(keLe == i)
                                        break;
                        }
                }
                 
                return gouMai;
        }

}


参考了楼上的一个小程序,并修复了其中一个Bug。参见步骤三的注意。
回复 使用道具 举报
  1. package test;

  2. /*
  3. * 3个瓶盖换一个可乐,多个人喝,需要买多少够喝.
  4. */
  5. public class Test010 {
  6.         public static void main(String[] args) {
  7.                 int man = 50;// 定义人数
  8.                 int pinggai = 0;// 定义已有瓶盖的数量;
  9.                 jisuankele(man,pinggai);
  10.         }

  11.         public static void jisuankele(int man,int pinggai) {
  12.                 // 已知人数,求需要买多少瓶可乐
  13.                 int sum = 0;// 定义sum变量,为最终喝到的可乐的数量
  14.                 int min = 0;// 定义最少需要购买的可乐数量.
  15.                 for (int x = 0; sum < man; x++) {
  16.                         // 循环遍历,x为购买的可乐的数量,当最终喝到的可乐数量大于等于人数的时候结束循环
  17.                         sum = jisuan(x, pinggai);// 调用方法,当购买x瓶的时候,最终喝到sum瓶.第二的参数为手里的瓶盖数量
  18.                         min = x;// 返回喝到可乐的数量的同时,也返回购买的可乐的数量
  19.                 }
  20.                 System.out.println("需要购买" + min + "瓶可乐,才够" + man + "人喝~");

  21.         }

  22.         public static int jiaohuan(int pinggai) {
  23.                 // 设置一个方法,已知瓶盖数量,返回交换到的可乐数量
  24.                 return pinggai / 3;
  25.         }

  26.         public static int jisuan(int kele, int shengyu) {
  27.                 // 设置方法,已知购买可乐数量,和已有的瓶盖数量,得到最终喝到的可乐数量.
  28.                 int sum = 0;// 设置一个变量,存储最后喝到的可乐数量.
  29.                 if (kele < 0) {
  30.                         return -1;// 如果可乐数量小于0,返回-1.
  31.                 } else if ((kele + shengyu) >= 3) {
  32.                         // 如果可乐加瓶盖数量大于等于3,就可以用正常方式换得可乐,调用交换方法.
  33.                         // 喝到的可乐的数量,等于可乐的数量加上通过交换最终喝到的可乐的数量.
  34.                         // 用来交换的瓶盖,等于喝剩下的瓶盖,和上一次交换剩下的瓶盖.
  35.                         int i = (kele + shengyu) % 3;// 定义变量存储这次交换,将会剩余瓶盖数量
  36.                         sum = kele + jisuan(jiaohuan(kele + shengyu), i);
  37.                 } else if ((kele + shengyu) == 2) {
  38.                         // 当喝完可乐,手里瓶盖数量等于2的时候,可以赊账,赊一个瓶盖,先换回一瓶,喝完后再还回瓶盖,这样可以多喝1瓶.
  39.                         sum = kele + 1;
  40.                 } else if ((kele + shengyu) == 1 || (kele + shengyu) == 0) {
  41.                         // 当喝完后瓶盖数量等于0或者等于1的时候,没有办法交换,只能买几瓶就喝几瓶..
  42.                         sum = kele;
  43.                 }
  44.                 // 其他情况,返回sum.
  45.                 return sum;
  46.         }
  47. }
复制代码


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