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位一存!好吧,今天先写到这里!明天就开学了,我得去看看书了~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |