解决阶乘过大超出变量范围的问题

计算阶乘计算到一定程度往往会超出范围

对于unsigned int ,四个字节,有32位,最大的数是 2 ^ 32 = 4,294,967,296; 然而 13! = 6,227,020,800 ;显然超出范围;

对于8个字节 long long 来说 ,2 ^ 64 = 18,446,744,073,709,551,616; 而 21! = 51,090,942,171,709,440,000 ; 显然也超出了范围.所以就需要找方法解决这一问题,让能计算的范围更大.

考虑到这一问题,我们可以用数组来存储每一位数字,然后逐个输出.

#include <stdio.h>
#define N 10000 // 这里数字根据个人情况
void Print_Factorial ( const int N );

int main()
{
    int N;
    printf("输入你想计算的阶乘数: ");
    scanf("%d", &N);
    Print_Factorial(N);
    return 0;
}
void Print_Factorial ( const int N )
{
	int num[N] = { 0 }; //当然这里你也可以用char类型数组,只要你转化啥没问题,为了省一点空间
	int i = 0;
	int j = 0;
	int l = 0 ;   //统计数字位数 
	int carry = 0;    // 进位 
	int s = 0; 
	num[0] = 1;  // 0! = 1 ; 个位初始为1; 
	if (N < 0)
	{
		printf("Invalid input");
	}
	else
	{
		for(i = 2 ; i <= N ; i++) 
		{
			for (j = 0 ; j <= l ; j++)
			{
				s = num[j] * i + carry ;
				num[j] = s % 10 ;
				carry = s / 10 ;
			}
			while (carry)
			{
				num[j++] = carry % 10;
				carry /= 10;
				l++;
			}
		}
		printf("%d! = ",N) ;
		while (l >= 0)
		{
			printf("%d",num[l]);
			l--;
		}
	}
        
}

 

  

 

而,用数组存储的一大问题就是进位问题,只要解决好进位,写好这一步,输出的问题就自然不大;

 

posted @ 2023-01-05 17:50  Code_wangg  阅读(87)  评论(0编辑  收藏  举报