输入一个正整数 n n n ,输出 n ! n! n! 的值。

其中
n ! = 1 × 2 × 3 × ⋯ × n n!=1×2×3×\cdots ×n n!=1×2×3××n

算法描述
n ! n! n! 可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组 A A A 来表示一个大整数 a a a A [ 0 ] A[0] A[0] 表示 a a a 的个位, A [ 1 ] A[1] A[1] 表示 a a a 的十位,依次类推。

a a a 乘以一个整数 k k k 变为将数组 A A A 的每一个元素都乘以 k k k ,请注意处理相应的进位。

首先将 a a a 设为 1 1 1 ,然后乘 2 2 2 ,乘 3 3 3 ,当乘到 n n n 时,即得到了 n ! n! n! 的值。
  
输入格式

输入包含一个正整数 n n n n ≤ 1000 n\le1000 n1000

输出格式

输出 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;
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐