当前位置:首页 » 《休闲阅读》 » 正文

阶乘 (C++)

8 人参与  2024年10月20日 11:20  分类 : 《休闲阅读》  评论

点击全文阅读


阶乘(factorial)

又称为阶乘函数,是数学中的一个重要概念。它表示一个正整数n与小于或等于它的所有正整数的乘积,通常以符号“n!”表示。在数学领域中,阶乘是一个广泛应用的概念,常常出现在排列组合、概率统计、数论等诸多领域中。

目录

阶乘(factorial)

1. 阶乘的定义

2. 阶乘的性质和应用

3. 阶乘的计算方法

(1) 用递归方式计算阶乘:

(2) 用循环方式计算阶乘:

(3) 用高精度算法计算阶乘:

4. [拓展] 双阶乘的概念

5. 结束语


1. 阶乘的定义

一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作 n! 。

1808年,基斯顿·卡曼 引进这个表示法,即 n! = 1×2×3×...×(n-1)×n 。

阶乘的定义非常简单,即n的阶乘 (n!) 等于小于或等于n的所有正整数的乘积。

2. 阶乘的性质和应用

阶乘具有以下几个性质

        (1):0的阶乘为1(0! = 1)。

        (2):负整数以及分数没有阶乘的定义。

        (3):阶乘增长非常快,随着n的增大,n!的值急剧增加。

阶乘在排列组合、概率统计、数论等领域有广泛的应用。

在排列组合中,阶乘用于计算有序的元素排列的方式数量。

例如,从n个元素中选取m个元素进行排列,可表示为  n!/(n-m)!  ,即从n个元素中任选m个元素进行排列的不同方式数量。

从n个元素中选取m个元素进行组合,可表示为  n!/(n-m)!/m!  ,即将其进行排列的结果除以m的阶乘,表示n个元素中任选m个元素进行组合的不同方式数量。

在概率统计中,阶乘用于计算排列组合方式的概率。例如,在一副扑克牌中,从中抽取5张牌的顺序不同的可能性就可以表示为5!。

在数论中,阶乘与素数、除法取模运算等概念有密切关联。例如,通过阶乘可以证明除法取模定理:对于任意的正整数n和素数p,n!模p的结果等于0。

3. 阶乘的计算方法

计算阶乘的方法可以通过递归或循环来实现。递归是一种将大问题分解为小问题的方法,通过反复调用自身来解决问题。用递归计算阶乘的公式为:    0! = 1 ,  n! = n×(n-1)!   。

(1) 用递归方式计算阶乘:
#include <bits/stdc++.h>using namespace std;int fact(int n){    if(n==0) return 1;    return n * fact(n-1);}int main(){    int n;    scanf("%lld",&n);    printf("%d",fact(n));    return 0;}

另一种常见的计算阶乘的方法是使用循环,从1到n逐步累乘得到阶乘的结果。

(2) 用循环方式计算阶乘:
#include <bits/stdc++.h>using namespace std;int main(){    int n,s=1;    scanf("%lld",&n);    for(int i=1;i<=n;i++){        s*=i;    }    printf("%d",s);    return 0;}

 但是,由于阶乘的增长特别快,13的阶乘( 6227020800 ) 就会超出 C++ 中int的数据范围(2147483647), 而21的阶乘( 51090942171709440000 ) 就会超出 C++ 中long long的数据范围(9223372036854775807), 具体数值可以看这篇博客 [阶乘表 1-100阶乘] , 所以,使用普通的数据类型无法计算较大数的阶乘。

这里就需要用到高精度算法(High Accuracy Algorithm)了。

(3) 用高精度算法计算阶乘:
#include<bits/stdc++.h>using namespace std;const int N=10000;int a[N];int main(){a[1]=1;int c=1,t=0,xxx,n;scanf("%d",&n);if(n<2){printf("%d",1);return 0;}for(int i=2;i<=n;i++){for(int j=1;j<=c;j++){xxx=a[j]*i+t;a[j]=xxx%10;t=xxx/10;}while(t){c++;a[c]=t%10;t/=10;}}for(int i=c;i>0;i--) printf("%d",a[i]);return 0;}

4. [拓展] 双阶乘的概念

双阶乘(即二次阶乘)是在阶乘的基础上的一个扩展概念。双阶乘表示对小于等于正整数n的所有奇数进行乘积。通常用符号“ n!! ”表示。

双阶乘的计算方法与阶乘类似,但考虑的元素不同,双阶乘只考虑奇数。通过递归或循环,将n的阶乘的奇数部分相乘得到双阶乘的结果。

双阶乘有其特殊的应用场景。例如,在组合数学中,双阶乘被用于计算排列组合的可能性。特别地,双阶乘在计算卡特兰数(Catalan number)时起到重要作用,卡特兰数表示在特定条件下有效的排列组合的数量。

5. 结束语

阶乘是数学中一个常用的概念,其定义是将一个正整数与小于或等于它的所有正整数相乘。阶乘的计算可以通过递归或循环来实现。阶乘具有多种性质和应用,常用于排列组合、概率统计和数论中。双阶乘是对小于等于正整数n的所有奇数进行乘积,其计算方法和阶乘类似。双阶乘在计算卡特兰数等应用中有特殊的作用。

今天的内容就到这里,创作不易,请大家多多支持博主!  [ 点赞+收藏+关注 ]


点击全文阅读


本文链接:http://zhangshiyu.com/post/174483.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1