昨天晚上奇安信笔试,两道编程题做的都不好,有紧张的元素,也有自己实力不够硬的问题,总之把两道编程题又做了一遍,思路屡清楚,下次继续努力!
其实两道题非常非常简单,如果放在高中数学,基本就是送分题了,但是最近疫情期间,在家都躺退化了。。。算了,开搞!
1. 第一题,抽硬币题
**题干:**有1000枚硬币,其中有10枚是金币,从中取出n枚硬币,求这n枚硬币中有金币的概率。答案保留6位小数。如抽取一枚,金的概率0.010000
**解题思路:**一道简单的高中数学送分题,如果正着去思考,那这n枚硬币中有可能是1枚金的,也可能是2枚金的,甚至更多,那就没法算了。
我们可以逆向思维,可能性只有两种,要么有金的,要么没金的,那我们可以计算没有金的的概率,用(1-没有金的),不就是有金的概率了吗?
好的我们来列一下数学公式:
没有金的概率 = (从990枚中抽取n枚的所有可能)/(从1000枚中抽取n枚的所有可能)
数学公式:
是不是一股熟悉的气息冒上心头,诶!对了,就是概率题嘛~
当然,有两个极端情况需要处理,那就是当抽取硬币大于990的时候,那就是百分百的概率了。当抽取小于0的时候,参数是错误的。这个相信每个boy和girl都好理解!
接下来还有一个问题要解决,那就是理论是理论,实际是实际,如果正好抽990个,那难道我们要把990的阶乘算一遍吗?显然是不行的,一来double类型根本是放不下的,而来题目也有时间和内存的要求,有同学想到字符串化之后处理,那么看看分子和分母,相除以。。。算了,我们来看看怎么办吧!
细心的胖友已经发现了,分子与分母有一段是重叠的,我们可以互相抵消,那么有多少是重叠的呢?
其实很简单,分母从1000到990是自己独占的,分母的最后一位(1000-n+1)和分子抵消后,分子还没有结束,直到(990-n+1)
接下来就简单了,我们只需要计算分母为1000到990的累乘,分子为(1000-n)到(990-n+1)的累乘即可。
接下来就是代码啦!代码里我也会标着我提到的点的注释,欢迎大家探讨纠错!
public class GoldSelect {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {