阶乘,维基百科对其定义为:
在数学中,一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1
计算n!时,当n不太大时,普通的科学计算机都可以计算,能够处理不超过 10^100(古高尔)数值的计算机可以计算至69!,而双精度浮点数的计算机则可计算至170!
由此可见,阶乘的增长速度十分的迅猛,先来看一下较小数的阶乘的递归与非递归实现:
#include<stdio.h>
#include<Windows.h>
#pragma warning (disable:4996)
int Recursion_Factorial(int n) //递归求阶乘
{
if (1 == n){
return 1;
}
else{
return n * Recursion_Factorial(n - 1);
}
}
int Factorial(int n) //非递归求阶乘
{
int res = 1;
while (n){
res *= n;
n--;
}
return res;
}
int main()
{
int num;
int res1 = 0;//int类型数据12后存不下
int res2 = 0;
/*
long res = 0;--------long型数据同样12后就存不下了,出现错误
long int res = 0;--------long int15以后就会出错
long long int res = 0;---------同样,15以后存不下
*/
printf("Enter a number to calculate:");
scanf("%d", &num);
res1 = Recursion_Factorial(num);
printf("Recursion_Factorial=%d\n", res1);
res2 = Factorial(num);
printf("Factrial=%d\n", res2);
system("pause");
return 0;
}
对于常规类型的数据类型存储一个数的阶乘,经过程序运行发现至多不会超过 15! ,那么,当需要更大的数的阶乘时,上面的算法显然远远不够,于是,我们引入了大数阶乘:
当然,求大数阶乘的前提是,该大数在int范围之内
对此,我们引入数组的概念,将数组的每个元素与大数相对应起来,则会方便求解许多
我们先从1开始阶乘,
1!=1, a[0]=1
2!=2X1=2, a[0]=2
3!=3X2=6, a[0]=6
4!=4X6=24, a[0]=24%10=4, a[1]=24/10=2
5!=5X24=120, a[0]=120%10=0, a[1]=120/10%10=2, a[2]=120/100=1
6!=6*120=720, a[0]=720%10=0, a[1]=720/10%10=2, a[2]=720/100=7
下面为c代码实现:
#include <stdio.h>
#include<Windows.h>
#pragma warning (disable:4996)
#define N 10000
int main()
{
int a[N] = { 1 };
int k = 0, length = 1;
int num;
int i, j;
printf("Enter a number to calculate its factorial:\n");
scanf("%d", &num);
for (i = 1 ; i <= num; i++)
{
for (j = 0; j<length; j++)
{
a[j] = a[j] * i + k;
k = a[j] / 10000;
a[j] = a[j] % 10000;
}
if (k)
{
a[j] = k;
length++;
k = 0;
}
}
printf("%d", a[length - 1]);
for (i = length - 2; i >= 0; i--)
printf("%d", a[i]);
printf("\n");
system("pause");
return 0;
}
如此,就实现了大数的阶乘