C语言实现求1000的阶乘

问题描述:

int:表示整数,通常占用4个字节(32位),取值范围为-2147483648到2147483647之间。
long:表示长整数,通常占用4个字节(32位)或8个字节(64位),取值范围至少为-2147483647到2147483647之间,具体取决于编译器和系统的实现。
long long:表示长长整数,通常占用8个字节(64位),取值范围为-9223372036854775808到9223372036854775807之间。

求1000!,这个数值非常大,超过了任何一个给定的数据类型的存储范围,所以无法直接使用给定的数据类型进行存储。

思路:

1000的阶乘是1x2x3x…x1000,
1000^1000=10的3000次方,那么1000的阶乘的位数一定少于3000位。所以开辟一个长度为3000的数组来存储最终的结果。
然后就像我们手算一样,逐位与结果数组相乘,产生了进位,就进到下一位,个位数更新即可。
完成从1x2x3x…xn的计算!
在这里插入图片描述

1.使用静态数组

代码:

#include <stdio.h>
#include <stdlib.h>
#define N 3000 

//求1000以内的阶乘 
int main()
{
    
    
	int n = 0;
	printf("输入要求的阶乘数n\n");
	scanf("%d", &n);
	
	//开辟存储结果的数组
	int a[N]={
    
    0};
	//应该初始化第0位为1,因为最小的,n!=1 
	a[0] = 1;
	//遍历1~n的乘数因子
	for(int i=2; i<=n; i++)
	{
    
    
		//临时计算值
		int term = 0;
		//进位值 
		int c = 0;
		//每个i与当前结果数组a[N]相乘
		for(int j=0;j<N;j++)
		{
    
    
			term = i*a[j]+c;
			//新的个位
			a[j] = term % 10;
			//给下一位的进位
			c = term / 10;	
		}	
	}
	
	//第一个不为0的数,对应的索引 
	int index = 0;
	//从前往后找第一个不为0的数
	for(int i=N-1;i>=0;i--)
	{
    
    
		if(a[i]!=0)
		{
    
    
			index = i;
			break;	
		}	
	}
	
	//输出阶乘的结果
	for(int j=index;j>=0;j--) 
	{
    
    
		printf("%d", a[j]);
	}
	
	return 0;	
	 
	
} 

运行结果:

在这里插入图片描述

2.使用动态数组

代码:

#include <stdio.h>
#include <stdlib.h> 
#define N 3000 

//求1000以内的阶乘 
int main()
{
    
    
	int n = 0;
	printf("输入要求的阶乘数n\n");
	scanf("%d", &n);
	
	//开辟动态数组
	int* a = (int*)malloc(N*sizeof(int));
	//应该初始化第0位为1,因为最小的,n!=1 
	a[0] = 1;
	//初始化其他位置中的值 
	for(int i=1; i<N;i++)
	{
    
    
		a[i] = 0;	
	} 
	//遍历1~n的乘数因子
	for(int i=2; i<=n; i++)
	{
    
    
		//临时计算值
		int term = 0;
		//进位值 
		int c = 0;
		//每个i与当前结果数组a[N]相乘
		for(int j=0;j<N;j++)
		{
    
    
			term = i*a[j]+c;
			//新的个位
			a[j] = term % 10;
			//给下一位的进位
			c = term / 10;	
		}	
	}
	
	//第一个不为0的数,对应的索引 
	int index = 0;
	//从前往后找第一个不为0的数
	for(int i=N-1;i>=0;i--)
	{
    
    
		if(a[i]!=0)
		{
    
    
			index = i;
			break;	
		}	
	}
	
	//输出阶乘的结果
	for(int j=index;j>=0;j--) 
	{
    
    
		printf("%d", a[j]);
	}
	
	//释放资源
	free(a); 
	return 0;	
	 
	
} 

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Elon15/article/details/129262419