错排问题(C语言)

devtools/2024/10/25 12:25:36/

 

错排问题(Derangement)是一个经典的组合数学问题,描述的是将 \( n \) 个元素进行排列,使得没有一个元素出现在它原来的位置上。换句话说,错排问题要求所有元素都不在它们原来的位置上。

### 错排问题的公式

错排问题的公式可以通过递推关系来推导。设 \( D(n) \) 表示 \( n \) 个元素的错排数。错排数 \( D(n) \) 可以通过以下递推关系来计算:

\[ D(n) = (n - 1) \left( D(n - 1) + D(n - 2) \right) \]

其中,初始条件为:
\[ D(0) = 1 \]
\[ D(1) = 0 \]

### 错排数的递推关系解释

1. **D(0) = 1**: 没有元素时,错排数为1(空排列)。
2. **D(1) = 0**: 只有一个元素时,不可能有错排。

对于 \( n \geq 2 \) 的情况:
- 假设第一个元素放在第 \( k \) 个位置(\( k \neq 1 \)),那么我们有两种情况:
  1. 第 \( k \) 个元素放在第一个位置,剩下的 \( n-2 \) 个元素进行错排,即 \( D(n-2) \)。
  2. 第 \( k \) 个元素不放在第一个位置,剩下的 \( n-1 \) 个元素进行错排,即 \( D(n-1) \)。

由于 \( k \) 有 \( n-1 \) 种选择(因为 \( k \neq 1 \)),所以总的错排数为:
\[ D(n) = (n - 1) \left( D(n - 1) + D(n - 2) \right) \]

### 错排数的直接公式

错排数 \( D(n) \) 也可以通过以下公式直接计算:
\[ D(n) = n! \left( 1 - \frac{1}{1!} + \frac{1}{2!} - \frac{1}{3!} + \cdots + (-1)^n \frac{1}{n!} \right) \]

这个公式是通过泰勒级数展开得到的,表示错排数与阶乘的关系。

### 错排概率

错排的概率 \( P(n) \) 是错排数 \( D(n) \) 与总排列数 \( n! \) 的比值:
\[ P(n) = \frac{D(n)}{n!} \]

### 示例

1. **n = 2**:
   - 总排列数:\( 2! = 2 \)
   - 错排数:\( D(2) = 1 \)
   - 错排概率:\( P(2) = \frac{1}{2} = 0.5 \)

2. **n = 3**:
   - 总排列数:\( 3! = 6 \)
   - 错排数:\( D(3) = 2 \)
   - 错排概率:\( P(3) = \frac{2}{6} = \frac{1}{3} \approx 0.3333 \)

### 代码实现

以下是计算错排数和错排概率的C语言代码:

```c
#include <stdio.h>

// 计算n的阶乘
long long factorial(int n) {
    long long result = 1;
    for (int i = 2; i <= n; i++) {
        result *= i;
    }
    return result;
}

// 计算n个元素的错排数
long long derangement(int n) {
    if (n == 0) return 1;
    if (n == 1) return 0;
    long long D[n + 1];
    D[0] = 1;
    D[1] = 0;
    for (int i = 2; i <= n; i++) {
        D[i] = (i - 1) * (D[i - 1] + D[i - 2]);
    }
    return D[n];
}

// 计算错排的概率
double calculate_probability(int n) {
    long long D_n = derangement(n);
    long long n_factorial = factorial(n);
    double probability = (double)D_n / n_factorial;
    return probability;
}

int main() {
    int C;
    scanf("%d", &C);
    for (int i = 0; i < C; i++) {
        int N;
        scanf("%d", &N);
        double probability = calculate_probability(N);
        double percentage = probability * 100;
        printf("%.2f%%\n", percentage);
    }
    return 0;
}
```

这个代码会计算每组测试数据的错排概率,并将结果以百分比形式输出,保留两位小数。


http://www.ppmy.cn/devtools/128681.html

相关文章

界面控件DevExpress WPF中文教程:Data Grid——表格视图概述

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

2020款Macbook Pro A2251无法充电无法开机定位及修复

问题背景 up主有一台2020年的Macbook Pro&#xff0c;带Touch Bar&#xff0c;16G512G&#xff0c;四核I5&#xff0c;型号A2251 应该是一周没充电了&#xff0c;之前还用的好好的&#xff0c;后来有一天出差想带上 打开没电&#xff0c;手头上有个小米的66W快充头&#xff0c…

关于ETL的两种架构(ETL架构和ELT架构)

ETL&#xff0c;是英文 Extract-Transform-Load 的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象…

【python实战】利用代理ip爬取Alibaba海外版数据

引言 在跨境电商的业务场景中&#xff0c;数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而&#xff0c;随着越来越多企业依赖数据驱动决策&#xff0c;许多跨境电商平台为了保护自身数据&#xff0c;采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部…

【功能安全】汽车功能安全个人认证证书

目录 1、证书 2、课程信息 &#x1f4d6; 推荐阅读 1、证书 汽车功能安全工程师去拿类似莱茵、SGS、南德颁发的证书&#xff0c;如下&#xff1a; 2、课程信息 一般上什么课程了&#xff0c;课程信息大概如下&#xff1a; 汽车功能安全工程师认证课 &#xff08;3天&#…

第2章·C程序设计的初步认识——例题汇总

本文是《全国计算机等级考试二级教程——C语言程序设计》中&#xff0c;第2章“C程序设计的初步认识”中的例题汇总。 【例2.1】求矩形的面积。 #include <stdio.h> main() { double a, b, area; a 1.2; b 3.6; area a * b; printf("a %f, b %f, ar…

前端面试题-token的登录流程、JWT

这是我的前端面试题的合集的第一篇&#xff0c;后面也会更新一些笔试题目。秋招很难&#xff0c;也快要结束了。但是&#xff0c;不要放弃&#xff0c;一起加油^_^ 一、token的登录流程 1.客户端用账号密码请求登录 2.服务端收到请求&#xff0c;需要去验证账号密码 3.验证成…

「C/C++」C++三大特性之封装、继承、多态(大致了解)

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…