加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

One Day One Step 之大数阶乘

发布时间:2020-12-14 03:43:10 所属栏目:大数据 来源:网络整理
导读:?? ??? 在说大数阶乘之前,我先来说一下大数乘法。一般来说,当操作数的数量级很大的时候,肯定是要用数组进行模拟的!之所以说是模拟,就是因为他模仿了我们我们平时做乘法时的步骤!不过我想了很久都不知道怎么把这个模拟过程给他描述出来,好吧,等下次有
??

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读