阶乘-C实现

阶乘,维基百科对其定义为:

在数学中,一个正整数的阶乘(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;
}

如此,就实现了大数的阶乘


THE END

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值