
Java编程题:年会抽奖(错排问题)
发布日期:2021-05-08 06:38:27
浏览次数:18
分类:精选文章
本文共 1475 字,大约阅读时间需要 4 分钟。
年会抽奖
今年公司年会的奖品特别给力,但获奖的规矩却很奇葩:
- 首先,所有人员都将一张写有自己名字的字条放入抽奖箱中;
- 待所有字条加入完毕,每人从箱中取一个字条;
- 如果抽到的字条上写的就是自己的名字,那么“恭喜你,中奖了!” 现在告诉你参加晚会的人数,请你计算有多少概率会出现无人获奖?
输入描述:
输入包含多组数据,每组数据包含一个正整数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个元素错排) 综上得到:
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; }}
来源:
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月03日 21时24分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
解决Chrome播放视频闪屏黑屏无法播放
2021-05-14
Java中final的理解
2021-05-14
Git简单理解与使用
2021-05-14
爬虫-01
2021-05-14
echarts 基本图表开发小结
2021-05-14
二分查找.基于有序数组的查找方法.704
2021-05-14
C语言文档操作
2021-05-14
制作JS验证码(简易)
2021-05-14
adb通过USB或wifi连接手机
2021-05-14
vue使用ecahrts词云图
2021-05-14
【README】回溯算法基本框架
2021-05-14
12、继承
2021-05-14
数组中常见的算法
2021-05-14
泛型机制 Generic
2021-05-14
包装类
2021-05-14
JDK9-15新特性
2021-05-14
集合继承结构
2021-05-14
ArrayList 实现类
2021-05-14
LinkedList 实现类
2021-05-14