输入N求N的阶乘的准确值。
5Sample Output
120
- 如果简单的用乘法去阶乘,那么不用多大,立马就爆了数据范围,于是,这道题的这个解法巧妙的对这个超级大的数进行了切分,具体切成多宽的看个人爱好,只要能够用几个数据类型装下来就好,这里我们划分成了8个的宽度,每八位存一下,最后再进行格式化输出,巧妙的避开了爆数据范围的问题。看着代码理解起来并不难,提示一下,c和进位相关,m和切的段数相关,就这样,相信大家看看都是可以理解的!!!
- AC Code:
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define _MAX 100000000 long long a[10005]; int main() { int i,j,n,m = 0; //m与切片有关,c与进位有关 long long c; //当C>0时,即代表进位 a[0] = 1; //不要忘记,0! = 1 scanf("%d",&n); for(i=1; i<=n; i++) { c = 0; for(j = 0; j<=m; j++) { a[j] = a[j] * i + c; c = a[j] / _MAX; a[j] = a[j] % _MAX; } if(c > 0) { m++; a[m] = c; } } printf("%lld",a[m]); //先输出首位 for(i = m - 1; i>=0; i--) { printf("%08lld",a[i]); //不足指定宽度前面补零 } return 0; }