/** * 共有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個,已沒法兌換,本次結束
參考資料:html
http://www.cnblogs.com/flyinghearts/archive/2011/09/23/2186593.htmlspa