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

  • Post author:
  • Post category:其他


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

对于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--;
        }
    }
         
}



版权声明:本文为w_g_141421原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。