题解 | #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")
查看6道真题和解析
海康威视公司福利 1158人发布