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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾翀   /  2014-7-30 21:09  /  8240 人查看  /  118 人回复  /   3 人收藏 转载请遵从CC协议 禁止商业使用本文

LFW 中级黑马 2014-8-1 17:45:31
61#
vaqh 发表于 2014-8-1 17:36
都是,,这个才叫简单明了,而且有逻辑

哥们、、、那个不对、、、、我后来我发现错误了。那每考虑兑换后的可乐仍有瓶盖的情况
回复 使用道具 举报
LFW 发表于 2014-8-1 17:45
哥们、、、那个不对、、、、我后来我发现错误了。那每考虑兑换后的可乐仍有瓶盖的情况 ...

是哦,,,
回复 使用道具 举报
hejinzhong 发表于 2014-7-31 18:51
开始的17,我算错了,
应该是 (28/3)*2+28%3 =19        (9x2+1)
你试试19

我来总结一下吧,撇开楼主的代码,因为太长不看,综合帖子里出现的其他两种算法
1.     (50/4)*3+50%4    这算法有失误,我之前也被迷住了,因为没考虑到当换了3次之后又可以换的问题
2.     (50/3)*2+50%3  这算法……表面上是对的,但是,某些情况下,就不符合现实世界的逻辑,现假设12个人喝水,这个算法算出来是需要8瓶,3+3+2 ,可以再换3瓶,然后剩两个瓶盖,所以最终结果是11瓶余两个瓶盖,但是 现实世界里,你能拿剩下的两个瓶盖去换一瓶水吗?能的话刚刚好够喝,但是不能!规则是必须3瓶才能换,对你来说可能没差别,因为你再买了一瓶够3瓶,又可以换一瓶,但是对老板来说不一样,差别是他多卖出了一瓶,而你也不能说这瓶是免费的,因为你不能把3个瓶盖又换出来的最后一瓶退给老板,所以遵循现实世界的逻辑才符合题目要求,而不是遵循算法,编程的目的也是为了解决现实生活中的问题,帖子里也很多朋友贴出逻辑的代码了,当然这只是个人见解,详细注释并且复贴一下:
  1. class BuyWater
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 person(51);
  6.         }

  7.    public static void person(int person)
  8.     {
  9.    
  10.        int bottle = 0; //瓶子数目
  11.            int cap = 0;    //瓶盖数目
  12.        int count = 0;  // 购买次数,代表每增加一,就买了一瓶水,也是最终
  13.                            //也就是最终需要购买的瓶数

  14.     while (bottle<person) //瓶数比人数少就买水
  15.     {  
  16.             count++;          //买了一瓶
  17.                 cap++;            //多了个瓶盖
  18.                 bottle++;         // 瓶子数增加
  19.                 if (cap==3)       //大优惠,三换一(不能2换一哦,想得美)
  20.                 {   
  21.                         cap = 0;     //瓶盖没了
  22.                         bottle++;    //换到了一瓶
  23.                         cap = 1;     //得了个瓶盖
  24.                        
  25.                 }
  26.     }
  27.         System.out.println(count); //最终买了count 瓶

  28.    }

  29. }
复制代码

点评

正解。遵不遵循现实逻辑倒不要紧,关键是拿2个瓶盖去换是解题者自作主张改变了题目的要求和条件  发表于 2014-8-2 16:45
回复 使用道具 举报
hejinzhong 发表于 2014-7-31 18:20
你想下,当2个人买了之后,第3个人就手握2盖子,当他喝完一瓶,不就3盖子了,还用付钱吗!可以说是先消费 ...

实际中会么
回复 使用道具 举报
blz01003hm 发表于 2014-7-31 18:59
啊,我的是 92列
public static void main(String[] args) {
        // TODO Auto-generated method stu ...

我试了下,是92
回复 使用道具 举报
楼主的方法很刁。。。。。

点评

哈哈。。。我喜欢  发表于 2014-8-4 15:44
回复 使用道具 举报

自己想的时候,就是没想到用布尔型数组。
回复 使用道具 举报
这个好像也是蓝桥杯的考试题
回复 使用道具 举报
hejinzhong 发表于 2014-7-31 06:15
(1)如果只要有盖子就可以换,那就是这样来写
2个人先买2瓶,将盖子给第3人,第三人即可免费喝一瓶了(先 ...

好想法!
回复 使用道具 举报
还是楼主代码简单 佩服佩服!!

点评

额。。。。。。谢谢哈  发表于 2014-8-4 15:46
回复 使用道具 举报
LFW 中级黑马 2014-8-2 16:36:27
71#
dispensable 发表于 2014-8-2 01:59
我来总结一下吧,撇开楼主的代码,因为太长不看,综合帖子里出现的其他两种算法
1.     (50/4)*3+50%4    ...

if (cap==3)       //大优惠,三换一(不能2换一哦,想得美)
                {   
                        cap = 0;     //瓶盖没了
                        bottle++;    //换到了一瓶
                        cap = 1;     //得了个瓶盖
                        
                }》》》》3盖换一瓶时,那瓶可乐直接就有了盖了,我个人觉得cap=0那一句话可以不写,感觉赘余
回复 使用道具 举报
LFW 中级黑马 2014-8-2 16:48:19
72#
裤裆里的温柔、 发表于 2014-8-1 14:51
不用搞这么麻烦,10行代码足矣,只测试了28和50通过,其他没试

是你英文太好还是我英语太菜,我看不懂你写的。。。
回复 使用道具 举报
厉害啊!
回复 使用道具 举报
357016138 发表于 2014-7-31 01:41
还是楼主代码简单 佩服佩服!!

有问题!

点评

什么问题  发表于 2014-8-4 15:53
回复 使用道具 举报
楼主你只是从宏观上考虑到瓶盖守恒,但是必须是3个瓶盖才能换一瓶可乐的,还有一种说法:一个瓶身等于2个瓶盖也是错的,假如我有10个瓶盖,难道可以换5瓶?????


int sum = 0; //需要的可乐数
int i =  0; //手中的盖子数
int j = 0;  //买的可乐数
while (sum<28)
{
        sum++;
        i++;
        j++;
        if (i%3==0)  //3个瓶盖换一瓶可乐,可乐数加1,剩下一个瓶盖
        {
                sum++;
                i=1;
        }
}

点评

那万一老板不借呢???。。。总感觉有点牵强!  发表于 2014-8-4 18:05
可以10个盖子换3瓶 余下1个盖子。。。。3瓶有三个盖子, 所以有四瓶和2个盖子。。。。问老板借一品汽水。。。刚好五瓶  发表于 2014-8-4 15:50
回复 使用道具 举报
LFW 发表于 2014-8-2 16:48
是你英文太好还是我英语太菜,我看不懂你写的。。。

again是再买的次数,buy是买的次数,bottle是瓶数,buy=1就是换了一瓶,。每次换完1瓶只需要再买2瓶就可以换一瓶,就是不停的+2,最后求出刚开始买的3瓶+每次再买的2瓶,是这个思路
回复 使用道具 举报
class Test
{
        public static void main(String[] args)
        {
                System.out.println(getNum(28));
                System.out.println(getNum(50));
        }
        public static int getNum(int num)
        {
                int cola=0,gai=0,mai=0;//cola为可乐总数,gai为瓶盖数,mai为买的可乐数
                while(cola<num)
                {
                        if(gai==3) 如果瓶盖是3,则换成一个可乐,还剩一个瓶盖,因此可乐数加一,瓶盖变成1
                        {
                                cola++;
                                gai=1;
                        }
                        else
                        {
                                ++mai;
                                ++gai;
                                ++cola;
                        }
                }
                return mai;
        }
}
回复 使用道具 举报
本帖最后由 地狱天堂 于 2014-8-2 19:55 编辑

开始也认为 (50/4)*3+50%4这个简单明了,细想确实忽略了赠送的瓶盖子。
但是按照这个思路,更改了一下代码。
比较dispensable的代码简化了一些,但是阅读可能差一点。结果都是一致的。
  1. class BuyWater {

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

  3.                 getBottle(51);

  4.         }
  5. /*
  6. * 以16人为例,其它人数的结构是一样的。
  7. * 人数:     1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16
  8. * 买是1:    1  1  1  0  1  1  0  1  1  0   1   1   0   1   1   0
  9. * 0处表示送了一瓶,并且多了一个盖子。
  10. *
  11. * 思路:
  12. * 按上图规律即除去第一个人,每3人可抱团。除去第1个人,每3个人需要买2瓶,不满3人自己买。
  13. * 那么p=人数,bottle= 需要购买的瓶数
  14. * bottle=((p-1)/3)*2+(p-1)%3+1
  15. *
  16. * 相比较dispensable的代码简化了一些,但是阅读可能差一点。
  17. * */
  18.         public static void getBottle(int p)
  19.         {
  20.                 int bottle;
  21.                 bottle=((p-1)/3)*2+(p-1)%3+1;
  22.                 System.out.println(bottle);
  23.         }

  24. }
复制代码

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