输入一个正整数 nnn ,输出 n!n!n! 的值。
其中
n!=1×2×3×⋯×nn!=1×2×3×\cdots ×nn!=1×2×3×⋯×n
算法描述
n!n!n! 可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组 AAA 来表示一个大整数 aaa ,A[0]A[0]A[0] 表示 aaa 的个位,A[1]A[1]A[1] 表示 aaa 的十位,依次类推。
将 aaa 乘以一个整数 kkk 变为将数组 AAA 的每一个元素都乘以 kkk ,请注意处理相应的进位。
首先将 aaa 设为 111 ,然后乘 222 ,乘 333 ,当乘到 nnn 时,即得到了 n!n!n! 的值。
输入格式
输入包含一个正整数 nnn ,n≤1000n\le1000n≤1000。
输出格式
输出 n!n!n! 的准确值。
样例输入
10
样例输出
3628800
高精
#include<bits/stdc++.h>
using namespace std;
vector<int> ans;
int n;
inline void mul(vector<int> &x, int y) {
int t = 0;
for (int &i : x) {
i = i * y + t;
t = i / 10;
i %= 10;
}
while (t) {
x.push_back(t % 10);
t /= 10;
}
}
int main() {
scanf("%d", &n);
ans.push_back(1);
for (int i = 2; i <= n; i++)
mul(ans, i);
for (int i = ans.size() - 1; i >= 0; i--)
printf("%d", ans[i]);
return 0;
}
压位高精
#include<bits/stdc++.h>
#define ll long long
using namespace std;
vector<ll> ans;
int n;
inline void mul(vector<ll> &x, int y) {
ll t = 0;
for (long long &i : x) {
i = i * y + t;
t = i / 1000000000;
i %= 1000000000;
}
while (t) {
x.push_back(t % 1000000000);
t /= 1000000000;
}
}
int main() {
scanf("%d", &n);
ans.push_back(1);
for (int i = 2; i <= n; i++)
mul(ans, i);
printf("%lld", ans.back());
for (int i = (int) ans.size() - 2; i >= 0; i--)
printf("%09lld", ans[i]);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<__int128> ans;
int n;
inline void mul(vector<__int128> &x, int y) {
ll t = 0;
for (__int128 &i : x) {
i = i * y + t;
t = i / 1000000000000000000ll;
i %= 1000000000000000000ll;
}
while (t) {
x.push_back(t % 1000000000000000000ll);
t /= 1000000000000000000ll;
}
}
int main() {
scanf("%d", &n);
ans.push_back(1);
for (int i = 2; i <= n; i++)
mul(ans, i);
printf("%lld", (ll) ans.back());
for (int i = (int) ans.size() - 2; i >= 0; i--)
printf("%018lld", (ll) ans[i]);
return 0;
}