一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且定义0的阶乘为1。自然数n的阶乘写作n!。即n!=1×2×3×…×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。
下面直接上源码,如计算1000!:
#include <stdio.h>
// result数组的最大长度
#define MAX_LEN 4096
// result数组,存放阶乘结果
int result[MAX_LEN];
// result数组的有效长度
int len = 0;
// factorial函数的功能是计算阶乘,结果存在result数组中
// 返回值:成功为0,失败为1
int factorial(int n)
{
int value = 0;
// 初始化result数组及有效长度长度
result[0] = 1;
len = 1;
for(int i=1; i<=n; i++)
{
for(int j=len-1; j>=0; j--)
{
value = i * result[j];
result[j] = value % 10;
value = value / 10;
int k = j + 1;
// 考虑进位,不增加result数组长度的情况
while(value > 0 && k < len)
{
value = value + result[k];
result[k] = value % 10;
value = value / 10;
k++;
}
// 考虑进位,增加result数组长度的情况
while(value > 0)
{
result[len] = value % 10;
value = value / 10;
len++;
if(len > MAX_LEN)
{
return 1;
}
}
}
}
return 0;
}
int main(void)
{
for(int i=0; i<=1000; i++)
{
// 计算阶乘
int ret = factorial(i);
// 计算失败
if(ret == 1)
{
printf("Error! Tooooooo long!!\n");
break;
}
// 打印阶乘结果
printf("%d! = ", i);
for(int j=len-1; j>=0; j--)
printf("%d", result[j]);
printf("\n");
}
return 0;
}
本文介绍了一种计算大数阶乘的方法,通过使用数组来存储计算过程中的每一位数字,解决了传统整型变量无法处理大数阶乘的问题。以1000的阶乘为例,展示了如何通过循环和进位处理实现大数阶乘的计算。
5037

被折叠的 条评论
为什么被折叠?



