在说大数阶乘之前,我先来说一下大数乘法。一般来说,当操作数的数量级很大的时候,肯定是要用数组进行模拟的!之所以说是模拟,就是因为他模仿了我们我们平时做乘法时的步骤!不过我想了很久都不知道怎么把这个模拟过程给他描述出来,好吧,等下次有时间我画个图吧,今天先贴代码!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define PI 3.14159265358979323846264338327950288419716939937510
int main( void )
{
__int64 n;
while( scanf( "%I64d", &n ) != EOF )
{
unsigned int len = ( int )ceil( ( n * log( n ) - n + log( 2 * n * PI ) / 2 ) / log( 10 ) ) + 1;
char * ans = ( char * ) malloc( len );
int tail, head, i, j;
unsigned int carryover; //这个是用来保存进位的
unsigned int tmp;
memset( ans, 0, len );
tail = head = len - 1;
ans[ tail ] = 1;
for( i = 2; i <= n; i++ )
{
carryover = 0;
for( j = tail; j >= head; j-- )
{
tmp = ans[ j ] * i + carryover;
ans[ j ] = ( char ) ( tmp % 10 );
carryover = tmp / 10;
}
while( carryover > 0 )
{
ans[ --head ] = ( char ) (carryover % 10);
carryover /= 10;
}
}
for( i = head; i <= tail; i++ )
{
printf( "%c", ans[i] + '0' );
}
putchar( '\n' );
}
}
这里面用到了一个叫做“斯特林公式”的东西,本来是用来估算n!的值的。不过,这个公式在这里的作用是为了求n!的值的长度!不过,由于时间比较匆忙,公式还不大理解。我想明天再写一篇详细的来仔细阐述一下,因为“大数阶乘”这个话题还有很多要说的!比如他的另一个更快的实现方法——4位一存!好吧,今天先写到这里!明天就开学了,我得去看看书了~