输入N(1 <= N <= 10000)
输出N的阶乘
5
120
解:这其实是MOD进制,将一个int或者long long数据类型作为一个数位,满MOD进一(本题中MOD=1000000000)。
(注意选择合适的数据类型,避免计算过程中数据溢出。)
1 #include <stdio.h> 2 3 #define MOD 1000000000 4 5 int a[50000]; 6 7 int main() 8 { 9 int n; 10 while (scanf_s("%d", &n) != EOF) 11 { 12 int j = 0; 13 a[0] = 1; 14 while (n > 1) 15 { 16 long long temp = 0; 17 int add = 0; 18 for (int i = 0; i < j + 1; i++) 19 { 20 temp = 1ll * a[i] * n + add; 21 add = temp / MOD; 22 a[i] = temp % MOD; 23 } 24 if (add) a[++j] = add; 25 n--; 26 } 27 printf("%d", a[j]); 28 while (j--) printf("%09d", a[j]); 29 printf("\n"); 30 } 31 return 0; 32 }
讲一些别的:
1.常量数据也有其相应的数据类型,计算过程中要注意转化。如:long long m = 1000000000 * 10;这样赋值就会产生错误,因为1000000000 和10都缺省int类型。
两种改进方法:① 强制转化 long long m = (long long)1000000000 * 10;
②用乘法改变数据类型 long long m =1ll*1000000000 * 10;
③使用long long类型数据常量 long long m =1000000000ll * 10;
在一些时候这三种方法其实是一样的方法,方法一中类型转化运算符比*(乘法)优先级高,故1000000000先被转化为1000000000ll(long long 类型)再与10乘;方法二中用乘法将1000000000转化为1000000000ll(long long 类型)再与10乘。
这样的转化中一定要注意在数据溢出前进行,如: long long m = (long long)(1000000000 * 10);和 long long m = 1000000000 * 10 * 1ll;就是错误的。
2.斯特林公式
斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。————《百度百科》