输入一个N,判断N的阶乘右边第一个非0的数字是多少
输入格式
共一行,包含一个整数 N。
输出格式
输出一个整数,表示 N! 的最右边的非零数字。
数据范围
1≤N≤1000
输入样例:
7
输出样例:
4
思路:
首先把里面的2 和 5 全给分出来,因为这俩数相乘才会出0。然后把剩下的撑起来,对10取模;
注:(a * b) mod c == (a mod c) * (b mod c)
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
int n;
cin >> n;
int res = 1, d2 = 0, d5 = 0;
for(int i = 1; i <= n; i ++)
{
int x = i;
while(x % 2 == 0) x /= 2, d2 ++;
while(x % 5 == 0) x /= 5, d5 ++;
res = res * x % 10;
}
int k = min(d2, d5);
for(int i = 0; i < d2 - k; i ++) res = res * 2 % 10;
for(int i = 0; i < d5 - k; i ++) res = res * 5 % 10;
cout << res << endl;
return 0;
}