首页 > 其他 > 详细

【USACO习题】阶乘问题

时间:2018-10-21 23:48:24      阅读:208      评论:0      收藏:0      [点我收藏+]

本题在洛谷上的链接:https://www.luogu.org/problemnew/show/P1134


 

刚开始做的时候,是这样想的,只有n个数的最后一位才会对答案造成影响,所以只管最后一位就好,但是还要把某位多余的0除掉。结果只对了两个点,我们只保留最后一位导致运算出现了误差,比如n=15时就会出错,解决办法是每次适当多保留几位,但比较糊弄。。。

还有一种办法是求出2和5的个数,因为2的个数一定不少于5的个数,且一对2和5相乘会在末尾产生一个0,所以用2的个数减5的个数,剩下的就是实际会对答案造成影响的2的个数。

另外,有一种看起来很高端的做法,可以证明每次乘8或乘5对末位的影响是一样的,所以可以将乘5换成乘8,而乘8每4次末位一循环。这样做,实际上每次递归求解(n/5)!的末位,再与之前的相乘,也可以通过迭代实现。

技术分享图片
 1 #include <cstdio>
 2 
 3 const int a[4] = {6, 8, 4, 2};
 4 
 5 int main() {
 6     int n, ans = 1;
 7     scanf("%d", &n);
 8     while (n > 0) {
 9         for (int i = 1; i <= n % 10; ++i)
10             if (i != 5) ans = ans * i % 10;
11         n /= 5;
12         ans = ans * a[n % 4] % 10;
13     }
14     printf("%d", ans);
15     return 0;
16 }
AC代码

 

【USACO习题】阶乘问题

原文:https://www.cnblogs.com/Mr94Kevin/p/9827605.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!