今天在朋友圈看到这样一个问题
一毛钱一个桃,三个核换一个桃,拿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。那样的话,就是可以无限换,此题解就是无穷大。
代码也很简单,就一个输出就能解决问题。
评论(0)