由于int有其本身的范围,所以,求阶乘很容易溢出
为此
我们用一个数组a[n]来存放阶乘结果的每一位,阶乘从1开始,a[0] = 1
1*2 = 2; a[0] = 2;
2*3 = 6; a[0] = 6;
6*4 = 24; a[0] = 4,a[1] = 2;
24 * 5 = 120 a[0] * 5 = 20,2进位,a[0] = 0, a[1] * 5 = 10,1进位,a[1] = 0+2 = 2; a[2] = 2;
120*6 = 720 a[0] * 6 = 0,a[0] = 0, a[1] * 6 = 12,1进位,a[1] = 2; a[2] * 6 = 6,在加上进位的1,也就是a[2] = 6+1 = 7
后面一样....................................................................
为此,我们需要两个循环,从1....n,n的阶乘
存储结果后的数组有多少位参与运算,1....total
还需设置一个进位标志flag。
#include <stdio.h>
char per[1000000]; /*保存结果的每一个位*/
int total; /*结果的位数*/
void fact(int num)
{
int i,j,flag,temp; /*flag是进位标志*/
per[0] = 1;
total = 1;
for (i=1,flag = 0; i<=num; i++)
{
for (j=0,temp = 0; j<total; j++)
{
temp = per[j] * i + flag; /*数组的每一位与i相乘*/
per[j] = temp % 10; /*每一位小于10*/
flag = temp / 10; /*所进的位数*/
}
while (flag)
{
per[total] = flag % 10;
total++;
flag = flag / 10;
}
}
}
int main()
{
int i, number;
printf("Please input a number:");
scanf("%d",&number);
fact(number);
printf("%d! = ",number);
for (i=total-1; i>=0; i--)
{
printf("%d",per[i]);
}
printf("\n一共%d位!\n",total);
return 0;
}