奇安信笔试编程题完整解析附代码

这篇博客详细解析了奇安信笔试中的两道编程题,包括抽硬币求金币概率和兔子繁殖问题。通过逆向思维解决抽硬币问题,利用累乘计算概率,避免阶乘计算;对于兔子繁殖问题,博主提出这是一个典型的队列问题,只需保存近四个月的兔子数量即可。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天晚上奇安信笔试,两道编程题做的都不好,有紧张的元素,也有自己实力不够硬的问题,总之把两道编程题又做了一遍,思路屡清楚,下次继续努力!

其实两道题非常非常简单,如果放在高中数学,基本就是送分题了,但是最近疫情期间,在家都躺退化了。。。算了,开搞!

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()) {
   
            // 取出的数量 与 返回的结果
            int n 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值