渣渣求解答今天奇安信面试的算法题第一题

1000枚硬币中有10枚金币,现取n枚硬币,求含有金币的概率。要求保留小数点后6位。

感觉是一道很简单的水题(因为另一道算法题是生兔子问题),但就是写了半天没过,最多通过20%的测试案例,因为概率论也忘得差不多了也没分析出个所以然,现在整得绕不过来这个弯了,求大佬指点下#奇安信##笔试题目#
全部评论
我超时后才写出来…枯了,要注意的点就是bigdecimal除法要记得在第二个参数处定义保留位数
2 回复 分享
发布于 2020-02-28 21:12
第二题可以用斐波那契数列么。。。为啥总是只过10%
1 回复 分享
发布于 2020-02-28 19:54
同没写出来...感觉是数学太渣
1 回复 分享
发布于 2020-02-28 20:02
感觉第一题有问题,按照组合的计算公式做过0,直接都算作独立事件990/1000乘n次反倒能过10%,,,感觉可能是精度问题
1 回复 分享
发布于 2020-02-28 20:03
都是10%,我也是调了75分钟只是10%。只看到有一个大佬达到20%
1 回复 分享
发布于 2020-02-28 20:35
我也只有10%。。。。
1 回复 分享
发布于 2020-02-28 21:02
奇安信真的难,售前工程师全是网络安全 加密。。
点赞 回复 分享
发布于 2020-02-28 19:48
我分了a>990, a >10(连乘10次)和a<=10(连乘a次)讨论,也没过数据,不懂。。
点赞 回复 分享
发布于 2020-02-28 19:53
我是*990/1000,然后*989/999,这样算n次,但是只通过10%
点赞 回复 分享
发布于 2020-02-28 20:02
用BigDecimal保留小数点后100位的精度都过不了,我特么服了。 import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; public class Main {     public static void main(String[] args) {         Scanner scanner = new Scanner(System.in);         int n = scanner.nextInt();         if (n == 0) {             System.out.printf("%.6f\n", 0.0d);         }         if (n >= 991) {             System.out.printf("%.6f\n", 1.0d);         }         BigInteger up = new BigInteger("1");         BigInteger down = new BigInteger("1");         for (int i = 0; i < n; ++i) {             up = up.multiply(new BigInteger("" + (990 - i)));             down = down.multiply(new BigInteger("" + (1000 - i)));         }                  BigDecimal upDecimal = new BigDecimal(up);         BigDecimal downDecimal = new BigDecimal(down);         upDecimal = upDecimal.divide(downDecimal, 100, BigDecimal.ROUND_DOWN);         double result = upDecimal.doubleValue();         System.out.printf("%.6f\n", 1.0d - result);     } }
点赞 回复 分享
发布于 2020-02-28 20:06
public class Main {     public static void main(String[] args) {         Scanner s = new Scanner(System.in);         int n = s.nextInt();         if (n < 0 || n > 1001){             return;         }         int g = 10;         int o = 990;         if (n > o){             System.out.println(1.000000);         }else {             BigDecimal k = calc(o,n);             BigDecimal m = calc(1000,n);             BigDecimal r = k.divide(m,BigDecimal.ROUND_HALF_UP);             BigDecimal res = BigDecimal.valueOf(1).subtract(r);             System.out.println(String.format("%.6f",res));         }     }    public static BigDecimal calc(int n, int m){        BigDecimal s = BigDecimal.valueOf(1);        BigDecimal m2 = BigDecimal.valueOf(1);         m = m > (n - m) ? (n - m) : m;         for (int i = m; i > 0; i--){             s = s.multiply(BigDecimal.valueOf(n));             m2 = m2.multiply(BigDecimal.valueOf(i));         }         return s.divide(m2,BigDecimal.ROUND_HALF_UP);    } } 崩溃中。
点赞 回复 分享
发布于 2020-02-28 20:08
public class Main228 {     public static void main(String[]args){         Scanner sc = new Scanner(System.in);         while(sc.hasNextInt()){             int n = sc.nextInt();             Main228 main = new Main228();             System.out.println(String.format("%.6f",main.helper(n).doubleValue()));         }     }     public BigDecimal helper(int n){         BigDecimal bg = new BigDecimal(Integer.toString(1000 - n));         for(int i = 999;i >= 991;i--){             bg = bg.multiply(BigDecimal.valueOf(i  - n));         }         BigDecimal pq = new BigDecimal(Integer.toString(1));         for(int i = 991;i <= 1000;i++){             pq = pq.multiply(BigDecimal.valueOf(i));         }         System.out.println(bg.divide(pq,100,BigDecimal.ROUND_HALF_UP));         BigDecimal result = new BigDecimal(Integer.toString(1)).subtract(bg.divide(pq,100,BigDecimal.ROUND_HALF_UP));         System.out.println(result.doubleValue());         return result;     }   } 所以哪错了。。。。
点赞 回复 分享
发布于 2020-02-28 20:09
import java.math.BigDecimal;import java.util.Scanner;public class Main { public BigDecimal goldenCoin(double n){ BigDecimal p; if (n >= 990){ p = new BigDecimal("1"); }else { BigDecimal m = new BigDecimal("1"); for (int i = 0; i < n ; i ++){ m = m .multiply (new BigDecimal(Double.toString(990 - i))); m = m.divide(new BigDecimal(Double.toString(1000 - i)), 6, BigDecimal.ROUND_HALF_UP); } p = new BigDecimal(1) .subtract(m) ; } return p; } public static void main(String[] args){ Scanner in = new Scanner(System.in); double n = in.nextDouble(); Main goldenCoin = new Main(); System.out.println(goldenCoin.goldenCoin(n).setScale(6,BigDecimal.ROUND_HALF_UP)); }}
点赞 回复 分享
发布于 2020-02-28 21:11
同过10%,难不成每次都保存六位?那精度损失也太多了吧
点赞 回复 分享
发布于 2020-02-29 07:53

相关推荐

点赞 评论 收藏
分享
评论
1
5
分享
牛客网
牛客企业服务