-
- 43通过
- 118提交
- 题目提供者该用户不存在
- 标签USACO
- 难度普及/提高-
讨论 题解
最新讨论
- 题目有错?
- 这是什么情况???
题目背景
N的阶乘写作N!,表示小于等于N的所有正整数的乘积。
题目描述
阶乘会变大得很快,如13!就必须用32位整数类型来存储,到了70!即使用浮点数也存不下了。 你的任务是找到阶乘最前面的非零位。举个例子:
5!=1*2*3*4*5=120,所以5!的最靠前的非零位是1。
7!=1*2*3*4*5*6*7=5040,所以最靠前的非零位是5。
输入输出格式
输入格式:共一行,一个不大于4,220的正整数N
输出格式:共一行,输出N!最靠后的非零位。
输入输出样例
输入样例#1:
7
输出样例#1:
4
说明
题目翻译来自NOCOW。
USACO Training Section 3.2
分析:最后一位非零数和乘的数有关,但是前面的很多一部分数字都不需要记录,这样的话我们可以每次取结果的最后一个非零数来计算,但是这样的话会WA,原因是我们列竖式做乘法时,将第一个乘数和第二个乘数的各位相乘,相加的时候会出现0的情况,而如果我们只取个位进行计算则无法考虑到这些情况,所以我们必须要多留几位数字,即%一个数,这个数要选的恰当好才行,10000和100000都可以,如果过大会TLE,过小会WA.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,ans = 1; int main() { scanf("%d", &n); //2 6 24 12 72 504 4032 for (int i = 2; i <= n; i++) { ans *= i; while (ans % 10 == 0) ans /= 10; if (ans > 10000) ans %= 10000; //printf("%d ", ans); } while (ans % 10 == 0) ans /= 10; ans %= 10; printf("%d ", ans); //while (1); return 0; }