喝汽水问题
/** * 共有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