今天在朋友圈看到這樣一個問題
一毛錢一個桃,三個核換一個桃,拿1塊錢最多能吃幾個桃
感覺腦海中忽然,某根神經被挑動了一下,
第一次看到這個題目的時候,應該是小學二三年級,學數學的時候,那時候沒啥玩具,父親大人就給我買了一本奧數,
當時回答,應該是說的,14,然后答案確實15,很有意思,
來看下程序
| 10 | 剩10個核 |
| 3 | 剩4個核(第一次的1加上這里的3) |
| 1 | 剩2個核(第二次的1加上這里的1) |
| 1 | 剩0個核 第三次兩個核+借來一個,吃了再把核還回去 |
所以結果就是10+3+1+1=15個,
再來說說,上次我看到這個題目,應該是大三還是大一的那一次程式設計競賽,
當時的思路就是,模擬這個程序,來進行編碼,
public class Test {
static int numWaterBottles(int num, int numExchange) {
int temp = num, sum = num;
while (temp >= numExchange) {
//換一個,減去要換的數量
temp -= numExchange;
//總數+1
++sum;
//核+1
++temp;
}
//如果最后剩兩個核,可以借一個吃了還回去
return temp == 2 ? ++sum:sum;
}
public static void main(String[] args) {
System.out.println(numWaterBottles(10, 3));
}
}
然后今天看到這個,突然覺得,這應該就是一個數學問題,應該有公式,于是去力扣上看了看,

好家伙,公式是有了,但是,好像這和我想的不太一樣,
如果,n個空瓶子,可以換一瓶酒,那么,是不是相當于,我每買n-1瓶酒就相當于買了 n瓶?
于是推論,每一瓶酒的價值,應該是(n-1)/n,
所以最后結果應該是,第一次有的數量num,除以這個價值,然后結果向下取整就好了,
這樣按照每瓶酒的價值來算,就避開了中間的兌換程序,
我們開頭說到的桃子問題,10個,三個核換一個,就可以這樣算,10/((3-1)/3) = 15 ,就很簡單,
當然因為公式的原因,為了避免程式出現除0例外,
我們寫代碼得判斷,是不是n=1,那樣的話,就是可以無限換,此題解就是無窮大,
代碼也很簡單,就一個輸出就能解決問題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/253079.html
標籤:java
