题目来源
题目描述
今年公司年会的奖品特别给力,但获奖的规矩却很奇葩:
- 首先,所有人员都将一张写有自己名字的字条放入抽奖箱中;
- 待所有字条加入完毕,每人从箱中取一个字条;
- 如果抽到的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
现在告诉你参加晚会的人数,请你计算有多少概率会出现无人获奖?
题目解析
该题目是计算中奖率,题目描述中抽奖是无放回的,那么问题就可以转换为排列组合问题。
抽奖可能出现的情况作为分母:
n = 1 出现 1 种情况; n = 2 出现 2 种情况; n = 3 出现 6 种情况;
n 出现 n! 种情况
每个人不可能抽中的情况作为分子:
假设每个人都中奖,可以认为 n 个元素都在中奖的位置
如果每个人都不中奖,那么只要确保n个元素不在原有中奖位置即可,那么问题转化为如何错排n个元素。
无法中奖的概率即为:C / F * 100 %
题目解答
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
float sum1=count(n);//每个人都不可能抽中出现的情况
float sum2=factorial(n);//抽奖可能出现的情况
float result=(sum1/sum2)*100;
System.out.println(String.format("%.2f",result)+"%");
}
}
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));
}
}
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;
}
}