在说大数阶乘之前,我先来说一下大数乘法。一般来说,当操作数的数量级很大的时候,肯定是要用数组进行模拟的!之所以说是模拟,就是因为他模仿了我们我们平时做乘法时的步骤!不过我想了很久都不知道怎么把这个模拟过程给他描述出来,好吧,等下次有时间我画个图吧,今天先贴代码!
#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位一存!好吧,今天先写到这里!明天就开学了,我得去看看书了~
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。