換汽水(華為程式設計題)
阿新 • • 發佈:2019-01-28
看到華為有一道換汽水的程式設計題,分享如下:
題目:某商店規定:三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?答案是5瓶,方法如下:先用9個空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這瓶滿的,這時候剩2個空瓶子。然後你讓老闆先借給你一瓶汽水,喝掉這瓶滿的,喝完以後用3個空瓶子換一瓶滿的還給老闆。如果小張手上有n個空汽水瓶,最多可以換多少瓶汽水喝?
題目要求的輸入是這樣的:第一行表示對少個空瓶能夠換一瓶汽水;然後有多行輸入,算出每行輸入的空瓶數最多能夠換購的汽水數。(這裡我們並不侷限於10次以內輸入)
好了我們分析一下怎麼做:
如果b個空瓶能夠換一瓶汽水,那麼當我們擁有的空瓶數小於b-2的時候是換不到汽水的(即使向老闆借一瓶也不夠);
如果我們擁有的空瓶數n=b-1,這時候就可以通過向老闆借一瓶汽水,然後喝完將所有的空瓶還給老闆來償還剛剛接的那瓶汽水,這樣可以喝到一瓶汽水;
如果我們手上的空瓶n>=b呢?我們可以拿儘可能多的空瓶即(n/b)*b個換來n/b瓶汽水,喝完換來的汽水的時候空瓶數為:n%b+n/b;
然後就可以利用遞迴的思想,再拿手上的空瓶去換購。
從上面的分析中可以發現,遞迴的結束條件是:手上的所有空瓶數小於等於b-2。
程式碼實現如下:
import java.util.Scanner;//用於獲得輸入 import java.util.ArrayList; public class QiShui { static int base, count;//用於記錄多少個空瓶換一瓶汽水和一共喝到的汽水數 public static void main(String[] args) { ArrayList<Integer> num1 = new ArrayList<Integer>();//用於記錄輸入 Scanner in = new Scanner(System.in); int tmp, number;//用於記錄臨時值和要計算的次數 while (true) { tmp = in.nextInt(); //判斷輸入是否結束 if (tmp == 0) { break; } num1.add(tmp);//這裡有一個int到Integer的轉換 } base = num1.get(0);//獲得多少空瓶換一瓶汽水 number = num1.size();//獲得要計算的數值個數 for (int i = 1; i < number; i++) { count = 0; fun(num1.get(i)); System.out.println(count); } } public static void fun(int n){ if(n <= base - 2) { return; } else if(n == base - 1) { count++; return; } else { count = count + n / base; fun(n / base + n % base);//遞迴呼叫 } } }