其他分享
首页 > 其他分享> > 关于三个瓶盖换一瓶汽水的问题的思考

关于三个瓶盖换一瓶汽水的问题的思考

作者:互联网

转:

关于三个瓶盖换一瓶汽水的问题的思考

今天在朋友圈看到这样一个问题

一毛钱一个桃,三个核换一个桃,拿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。那样的话,就是可以无限换,此题解就是无穷大。

代码也很简单,就一个输出就能解决问题。

 

 

 

 

转:

关于三个瓶盖换一瓶汽水的问题的思考

标签:汽水,temp,10,int,sum,num,一瓶,瓶盖
来源: https://www.cnblogs.com/wangtcc/p/14726934.html