One Day One Step 之大数阶乘



    在说大数阶乘之前,我先来说一下大数乘法。一般来说,当操作数的数量级很大的时候,肯定是要用数组进行模拟的!之所以说是模拟,就是因为他模仿了我们我们平时做乘法时的步骤!不过我想了很久都不知道怎么把这个模拟过程给他描述出来,好吧,等下次有时间我画个图吧,今天先贴代码!

#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位一存!好吧,今天先写到这里!明天就开学了,我得去看看书了~


猜你喜欢

转载自blog.csdn.net/u011564456/article/details/19766779
one