Java编程题:年会抽奖(错排问题)
发布日期:2021-05-08 06:38:27 浏览次数:18 分类:精选文章

本文共 1475 字,大约阅读时间需要 4 分钟。

年会抽奖

今年公司年会的奖品特别给力,但获奖的规矩却很奇葩:

  1. 首先,所有人员都将一张写有自己名字的字条放入抽奖箱中;
  2. 待所有字条加入完毕,每人从箱中取一个字条;
  3. 如果抽到的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
    现在告诉你参加晚会的人数,请你计算有多少概率会出现无人获奖?

输入描述:

输入包含多组数据,每组数据包含一个正整数n(2≤n≤20)。

输出描述:

对应每一组数据,以“xx.xx%”的格式输出发生无人获奖的概率。

示例1

输入
2
输出
50.00%

解析:

本题求解需要求出所有可能的抽奖情况,及所有人都不中奖时的情况,两者相除即为所得。这里主要牵扯到了一个错排问题。

错排问题: n个有序的元素应有n!个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排;有的叫重排。

求的递推关系,分两步走:

第一步,考虑第n个元素,把它放在某一个位置,比如位置k,一共有n-1种放法;
第二步,考虑第k个元素,这时有两种情况:
(1)把它放到位置n,那么对于除n以外的n-1个元素,由于第k个元素放到了位置n,所以剩下n-2个元素的错排即可,有Dn-2种放法;
(2)第k个元素不放到位置n,这时剩下的这n-1个元素错排就好了,有Dn-1种放法。(如果位置n不放第k个元素,那么我们就可以把第k个元素当作是原来的第n个元素,相当于n-1个元素错排)
综上得到:
1

import java.util.*;public class Main {       public static void main(String[] args) {           Scanner scan = new Scanner(System.in);        while(scan.hasNext()){               int n = scan.nextInt(); //数据的个数            float sum1 = factorial(n);            float sum2 = count(n);//将得到的分子分母进行相除,就可以得到概率了。            float result1 = (sum2/sum1)*100;            System.out.println(String.format("%.2f%%", result1) );        }    }/** * 错排算法 */public static float count(int n) {       if(n==1){           return 0;    }else if(n==2){           return 1;    }else{           return (n-1)*(count(n-1)+count(n-2));    }}    /**     * n的阶乘     */    public static float factorial(int num) {           float result = 1;        if(num==0){               return 1;        }else if (num > 0) {               result = num * factorial(num - 1);        }        return result;    }}

来源:

上一篇:Java编程题:数字和为sum的方法数(动态规划——背包问题)
下一篇:Java编程题:整数与IP地址间的转换

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月03日 21时24分17秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章