突然发现大数阶乘还能用这么简单的数组模拟,但是感觉复杂度好像有点高,一次运算是n*MAXN的复杂度,虽然空间复杂度比较低。
#include<stdio.h> #include<string.h> const int MAXN = 50000; int main() { int n; scanf ( "%d",&n ); int f[MAXN]; memset ( f,sizeof ( f ) ); f[0] = 1; for ( int i = 2; i <= n; i++ ) { //遍历2-n int c = 0; //记录进位 for ( int j = 0; j < MAXN; j++ ) { //f[]记录乘出来的结果f[0],f[1]分别记录个位十位的值 int s = f[j] * i + c; //暂存各个位的结果 f[j] = s % 10; c = s / 10; } } int i; for ( i = MAXN - 1; i >= 0; i-- ) //忽略前导零 if ( f[i] != 0 ) { break; } for ( int j = i; j >= 0; j-- ) { printf ( "%d",f[j] ); } printf ( "\n" ); return 0; }