对于大数来说,一个数的阶乘是非常大的,同样,一个int类型的整数,他的阶乘就有可能会很大。
就拿50来说,他的阶乘位数是65位,就已经远远超过了long long int类型的最大值。这时候,我们要通过字符串的方法,来进行阶乘的运算。
将大数与数组结合
对于大数阶乘来说,最重要的是如何将每个数的每位数与相对应的数组元素储存起来,就如算50的阶乘,我们要先从1开始乘:
1*2=2,将2存到a[0]中,
接下来是用a[0]*3;
2*3=6,将6储存在a[0]中,
接下来是用a[0]*4;
6*4=24,是两位数,那么24%10==4存到a[0]中,24/10==2存到a[1]中,
接下来是用a[0]*5;a[1]*5+num(如果前一位相乘结果位数是两位数,那么num就等于十位上的那个数字;如果是一位数,num==0)
24*5=120,是三位数,那么120%10==0存到a[0]中,120/10%10==2存到a[1]中,120/100==1存到a[2]中,
接下来是用a[0]*3;a[1]*6+num;a[2]*6+num;
120*6=720,那么720%10==0存到a[0]中,720/10%10==2存到a[1]中,720/100==7存到a[2]中,
...................
直到乘到50,将每一位数储存为止。
#include <stdio.h>
int main()
{
int digit , temp , n , i , j;//digit = 位数 , temp 各位相乘后的数
int a[20001];
a[0] = 1;
digit = 1; // 初始位数为一 , 个位
scanf("%d" , &n);
for(i = 2 ; i < n ; i++)//i 从2 开始
{
int num = 0 ;//num 用来表示每次进位的数
for(j = 0 ; j < digit ; j++)
{
temp = a[j] * i + num;// 由这里可知为什么a[0] = 1 。 不同位上的数都要乘以 i , 每乘一次都要进行一次分配 与 进位
a[j] = temp % 10;
num = temp / 10;
}
while(num) // 如果上面循环完 , num 的值还不为0 则 表示最后一位需要进位
{
a[digit] = num % 10;
num = num / 10;
digit++;
}
}
for(i = digit - 1 ; i >= 0 ; i--)//存数时 是 自1 ~ digit 存 , 因此反着输出
{
printf("%d" , a[i]);
}
printf("\n");
return 0;
}