阶乘 (C++)

阶乘(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的所有奇数进行乘积,其计算方法和阶乘类似。双阶乘在计算卡特兰数等应用中有特殊的作用。

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

  • 44
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值