输入一个正整数n,输出n!的值。
输入一个正整数n,输出n!的值。其中n!=123*…*n。算法描述n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。 输入格式输入包含一个...
输入一个正整数 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 n≤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;
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)