题解 | #N的阶乘#
N的阶乘
https://www.nowcoder.com/practice/f54d8e6de61e4efb8cce3eebfd0e0daa
#include <iostream> #include <iterator> #include <bits/stdc++.h> using namespace std; struct bign{ int nums[3001]; //由于n的阶乘结果可以达到几千位 所以这里要设大点 但是也不要太大 可能会超内存 int lens; bign(){ //初始化 置0 memset(nums,0,sizeof(nums)); lens = 0; } }; bign multiply(bign a, bign b){ //大精度乘法 bign res; int length; for(int i = 0; i < a.lens; i++){ //按照我们平时在草稿纸手算的步骤来写 int carry = 0; //需要进位 length = i; //这里要模拟外循环位置 初始开始存的位置 由于权值的不同 位置会比上一次大1 for(int j = 0; j < b.lens; j++){ int current = a.nums[i] * b.nums[j] + carry; //获取当前位 要加上进位 int jinwei = res.nums[length] + current; //这里由于乘法 要累加 res.nums[length++] = jinwei % 10; // 得到本位 需要累加 要模10 因为 有可能大于10; carry = jinwei / 10; //此时再模10得到进位 } if(carry) res.nums[length++] += carry; //如果运算结束 carry 不为0 说明有进位 直接最高位赋值即可 } res.lens = length; //赋值lens return res; } bign change(int num){ //将num 转换位 高精度 实质上其实就是字符串转换 bign res; while(num > 0){ int t = num % 10; res.nums[res.lens++] = t; num /= 10; } return res; } bign ans; bign jiecheng(int n){ //递归 跟基本出的差不多 ans = change(n); if(n == 1) return ans; return multiply(ans,jiecheng(n - 1)); } int main() { int n; while(cin >> n){ bign res = jiecheng(n); for(int i = res.lens - 1; i >= 0; i--) //注意从后开始输入 cout << res.nums[i]; cout << endl; } } // 64 位输出请用 printf("%lld")