您的位置:首页 > 其它

每日一算法:大数的阶乘

2013-10-24 20:08 190 查看
由于int有其本身的范围,所以,求阶乘很容易溢出

为此

我们用一个数组a
来存放阶乘结果的每一位,阶乘从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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: