计算阶乘计算到一定程度往往会超出范围
对于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 版权协议,转载请附上原文出处链接和本声明。