黑马程序员技术交流社区

标题: 喝汽水问题 [打印本页]

作者: 时过境迁    时间: 2015-4-9 19:51
标题: 喝汽水问题
/*28人喝汽水。三个瓶盖可以换一瓶汽水。
问:28人每人喝一瓶汽水最少买几瓶汽水
*/
import java.util.Scanner;
class A
{
public static void main(String[] args){
  Scanner sc = new Scanner(System.in);
  System.out.println("请输入喝汽水的人数:");
  int number = sc.nextInt();
  int a = people(number);//变量a记录返回的值(最低瓶数)
  System.out.print("最少买"+a+"瓶可以满足");
  
}

public static int people(int ping){//
  //定义一个计数器
  int count=0;
  for(int x = 0; x <= ping;x++){
   if(x%3==0)
   {
    x++;//当喝到三瓶的倍数时可以多喝一瓶,这次不被记录
   }
    count++;
  }
  return count;//返回
}
}

作者: sisel    时间: 2015-4-9 20:08
本帖最后由 sisel 于 2015-4-9 20:52 编辑

刚才口算错了。。算法应该是28-9@3=19把问题看复杂了
  1. package com.itheima;

  2. public class Drink {

  3.         public static void main(String[] args) {
  4.                 System.out.println(tryGetDrinks(29));
  5.         }

  6.         private static int tryGetDrinks(int drinks) {
  7.                 int tryi=drinks/2;
  8.                 for (; tryi<drinks; tryi++) {
  9.                         int atAllDrinked = new DrinkParty(tryi).atAllDrinked();
  10.                         if(atAllDrinked>=drinks){
  11.                                 return tryi;
  12.                         }
  13.                 }
  14.                 return -1;
  15.         }
  16.        
  17.        

  18. }

  19. class DrinkParty{
  20.         int drinked,buyed,caps;

  21.         public DrinkParty(int buyed) {
  22.                 super();
  23.                 this.buyed = buyed;
  24.                 this.drinked=buyed;
  25.                 this.caps=buyed;
  26.         }
  27.        
  28.         private boolean more(){
  29.                 return caps>=3;
  30.         }
  31.        
  32.         private void rollAndDrink(){
  33.                 System.out.println(this);
  34.                 int rolled = caps/3;
  35.                 this.drinked+=rolled;
  36.                 caps=caps%3+rolled;
  37.         }
  38.        
  39.         @Override
  40.         public String toString() {
  41.                 return "[buyed:\t"+buyed+"\tdrinked:\t"+drinked+"\tcap:\t"+caps+"\t]";
  42.         }

  43.         public int atAllDrinked(){
  44.                 while(this.more()){
  45.                         this.rollAndDrink();
  46.                 }
  47.                 return drinked;
  48.         }
  49. }
复制代码



作者: 时过境迁    时间: 2015-4-9 20:42
sisel 发表于 2015-4-9 20:08
这个。。。。数学就可以算了3》4,9》13,27》40,故28=13*2+2,需要20瓶

19 哦  亲
作者: 1017161726    时间: 2015-4-9 20:56
这个初中学过啊。最省的方式是最后把所有瓶盖兑换完。
n瓶汽水,n个瓶盖,可以换n/3瓶汽水,然后兑换回的汽水瓶盖又可以继续兑换。
有一点要注意,就是如果只有两个瓶盖,可以先赊账一瓶,喝了之后还3个瓶盖。
  如果是买18瓶汽水,喝之后,换回6瓶,再喝之后,换回两瓶,然后赊一瓶。一共18+6+2+1=27人喝到汽水。
所以应该多买一瓶,就是19瓶汽水。
代码就写买n瓶汽水最多m人喝到汽水。判断m什么时候等于28就行。
上面那个代码修改一下就行了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2