蓝桥杯 阶乘末尾 模拟

问题描述
  给定n和len,输出n!末尾len位。
输入格式
  一行两个正整数n和len。
输出格式
  一行一个字符串,表示答案。长度不足用前置零补全。
样例输入
6 5
样例输出
00720
数据规模和约定
  n<=30, len<=10。
基础还是不扎实,调试了好久,一些细节问题没有考虑好,配合测试样例才一步一步改好。
解题思路:之前做过一个类似的简化版的题目,忘记在哪做的了,以后补上。
本题既然要输出n!的后len位,那就在求n!的过程中每一步都对10^(len+2)取模。最后将阶乘结果转为字符串,方便加上前导0.
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll f(int n) { //返回10的n次方 
 5     ll t = 1;
 6     for (int i = 1; i <= n; i++) {
 7         t *= 10;
 8     }
 9     return t;
10 }
11 int main() {
12     int n, len;
13     cin >> n >> len;
14     ll ans = 1;
15     ll mod = f(len + 2);
16     for (int i = 1; i <= n; i++) {
17         ans = (ans % mod * i % mod) % mod;
18     }
19     string s = "";
20     while (ans) {
21         int t = ans % 10;
22         s += t + '0';
23         ans /= 10;
24     }
25     s = s.substr(0, len);
26     reverse(s.begin(), s.end());
27     while (s.length() < len) {
28         s = "0" + s;
29     }
30     cout << s << endl;
31     return 0;
32 }

猜你喜欢

转载自www.cnblogs.com/fx1998/p/12641295.html
今日推荐