年会抽奖

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

  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个元素错排)
综上得到:

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编程题:年会抽奖(错排问题)相关推荐

  1. java 编程题_最新JAVA编程题全集(50题及答案)92862

    <最新JAVA编程题全集(50题及答案)92862>由会员分享,可在线阅读,更多相关<最新JAVA编程题全集(50题及答案)92862(32页珍藏版)>请在人人文库网上搜索. ...

  2. JAVA编程题全集(50题及答案) 之 21-50题

    JAVA编程题全集(50题及答案) 之 java编程题1~20题 [程序21] 题目:求1+2!+3!+-+20!的和 public class lianxi21 {public static voi ...

  3. java经典50道_50道经典的JAVA编程题(41-45)

    50道经典的JAVA编程题(41-45),苦逼的程序猿,晚上睡不着了编程吧~今天坚持做10道题!发现编程能是我快乐...O(∩_∩)O哈哈~能平静我烦乱的心,剩下5道题留到考试完了再做吧!该睡觉了.. ...

  4. 质量不同的球java编程_荐非常经典的java编程题全集-共50题(1-10)...

    非常经典的java编程题 程序1:斐波那契数列问题 题目概述: 古典问题: 有一对兔子,从出生第三个月起每月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多 ...

  5. java语言编程三角形图形_编程题:编写程序输入三角形的3条边长,计算并输出... 求助一道JAVA编程题:编写一个类似记事本的图形用......

    导航:网站首页 > 编程题:编写程序输入三角形的3条边长,计算并输出... 求助一道JAVA编程题:编写一个类似记事本的图形用... 编程题:编写程序输入三角形的3条边长,计算并输出... 求助 ...

  6. java类求圆的面积周长_java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题。编写一个应用程序计算圆的周长和面积,设圆的半...

    问题标题 java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题.编写一个应用程序计算圆的周长和面积,设圆的半 2019-5-23来自ip:15.196.194.53的 ...

  7. java设计一个形状shape_编程定义一个图形接口 Shape, 内含2个抽象方法 get... JAVA编程题:编一个程序包含一个接口 shape(该接......

    导航:网站首页 > 编程定义一个图形接口 Shape, 内含2个抽象方法 get... JAVA编程题:编一个程序包含一个接口 shape(该接... 编程定义一个图形接口 Shape, 内含2 ...

  8. java编程50_荐非常经典的java编程题全集-共50题(1-10)...

    非常经典的java编程题 程序1:斐波那契数列问题 题目概述: 古典问题: 有一对兔子,从出生第三个月起每月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多 ...

  9. 一些简单的java编程题(2) ————古典问题(兔子问题)

    版权声明: 本文为博主原创文章,未经博主允许不得转载. /* (程序头部注释开始) 版权声明:保留个人权利. 如程序有不当之处,敬请指正.* 文件名称: <一些简单的java编程题(2) --- ...

  10. Java编程题小练习(初级):输入10个整数并进行排序输出。

    程序代码: package com.xingzhao.Test; /** 题目描述:输入10个整数,排序后输出.* * 分析:* 1.输入10个整数,存储为数组* 2.使用冒泡排序法将数组排序* 3. ...

最新文章

  1. 手机qpython下载_QPython
  2. 图像化转向名词解释_遥感——数字图像处理名词解释及简单整理
  3. HDFS读写文件实例与解析
  4. Oracle常用知识总结
  5. DT时代下 数据库灾备的探索与实践
  6. 数据科学入门与实战:玩转pandas之六时间序列
  7. JavaScript中的高级特性及特别对象、属性和方法
  8. python 服务端判断客户端异常断开
  9. linux操作实例,linux下的一些文档操作实例 | Soo Smart!
  10. 漫谈Java IO之 NIO那些事儿
  11. spring扩展点一:BeanDefinitionRegistryPostProcessor
  12. 神经网络是不是分类算法,人工神经网络分类算法
  13. GET 和POST的用法
  14. 怎样才能叫高级程序员?
  15. 最全的Gateway统一网关快速入门
  16. 企业经营核心要素框架
  17. Java基础第一讲:Java的故事和Java编程环境搭建
  18. MySQL隔离级别的底层理解(MVCC+锁)
  19. 第七周求圆柱体表面积
  20. Android Audio - 支持多个CODEC同时录音

热门文章

  1. 七天学完Vue之第二天学习笔记(自定指令,过滤器,生命周期函数,动画效果)
  2. ChinaITLab Linux实战工程师网校课程-8CD
  3. 医疗信息管理系统(HIS)——>业务介绍
  4. 服务器网卡驱动装好后本地连接显示,系统装好后网卡驱动也装好了,可是没有本地连接,怎么弄...
  5. 牛顿迭代法的图像推导思路以及代码
  6. 东芝2303am维护清零_东芝打印机2303A怎样清零
  7. QQ的clientkey与淘宝旺旺Token 不同平台环境下的登录认证
  8. html yy直播,网页YY直播间进入方法 网页YY迷你版怎么用
  9. Apache HttpClient4使用教程
  10. 计算机无法启动打印服务,Win7无法启动print spooler服务报错1068怎么办?