喝汽水问题

    /**
     * 共有1000瓶汽水,没喝完一瓶得到一个空瓶子,每3个空瓶子又能换1瓶汽水,喝掉以后又得到一个空瓶子,问总共能喝多少瓶汽水,最后还剩余多少个空瓶子
     */
    public static void drink(){
        int num = 1000, empty = 0, total = 0;
        while(num > 0){
            num --;//喝掉一瓶汽水,那么喝掉的汽水总数又多1,此时空瓶数又多1,需要判断空瓶数是否整除3,若是则又可以兑换1瓶汽水,空瓶数为0,如此递归,直到汽水数为0
            total ++;
            empty ++;
            if(empty % 3 == 0){
                num ++;
                empty = 0;
            }
        }
        System.out.println(String.format("total=%d, empty=%d", total, empty));
    }
    
    public static void drink2(){
        int num = 1000, empty = 0, total = 0;
        while(num > 0){
            System.out.println(String.format("total=%d, empty=%d", num, empty));
            total += num;//直接将剩余的所有汽水喝掉,那么喝掉的汽水总数就增加了刚喝掉的num,此时空瓶数则为刚喝掉的汽水数num,而此时的空瓶又可以兑换empty/3瓶汽水,并且剩余的空瓶数为兑换前空瓶总数-兑换的汽水数*3,如此递归,直到汽水数为0
            empty += num;
            num = empty / 3;
            empty = empty - num * 3;
        }
        System.out.println(String.format("total=%d, empty=%d", total, empty));
    }
1)喝掉1000瓶,剩余0瓶
1000
0

2)、上次有空瓶1000个,可兑换333瓶汽水,故本次可以喝掉333瓶,剩余1个空瓶
333
1

3)、上次有空瓶333+1个,可兑换111瓶汽水,故本次可以喝掉111瓶,剩余1个空瓶
111
1

4)、上次有空瓶111+1个,可兑换37瓶汽水,故本次可以喝掉37瓶,剩余1个空瓶
37
1

5)、上次有空瓶37+1个,可兑换12瓶汽水,故本次可以喝掉12瓶汽水,剩余2个空瓶
12
2

6)、上次有空瓶12+2个,可兑换4瓶汽水,故本次可以喝掉4瓶汽水,剩余2个空瓶
4
2

7)、上次有空瓶4+2个,可兑换2瓶汽水,故本次可以喝掉2瓶汽水,剩余0个空瓶
2
0

8)、上次有空瓶2个,已无法兑换,本次结束

参考资料:

http://www.cnblogs.com/flyinghearts/archive/2011/09/23/2186593.html

原文地址:https://www.cnblogs.com/xiaoxian1369/p/5556890.html