题目描述
也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:
12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600
12的阶乘最右边的非零位为6。
写一个程序,计算N(1≤N≤50,000,000)阶乘的最右边的非零位的值。
注意:10,000,000!有24999992499999个零。
输入格式
仅一行包含一个正整数N。
输出格式
一个整数,表示最右边的非零位的值。
输入输出样例
输入 #1复制
12输出 #1复制
6
- mod 10
#include <bits/stdc++.h>
#define MAXN 2005
#define inf 0x3f3f3f3f
#define rep(x, a, b) for(int x=a; x<=b; x++)
#define per(x, a, b) for(int x=a; x>=b; x--)
using namespace std;
//int ans[MAXN];
int main()
{
long long num;
cin>>num;
long long ans = 1;
for(long long i = 2; i<= num; i++)
{
ans *= i;
while(ans %10 == 0)
{
ans /= 10;
}
ans %= inf;
}
cout<<ans%10;
return 0;
}
- mod 2
#include <bits/stdc++.h>
#define MAXN 1e6;
#define rep(x, a, b) for(int x=a; x<=b; x++)
#define per(x, a, b) for(int x=a; x>=b; x--)
using namespace std;
//int ans[MAXN];
int main()
{
long long num;
long long ans = 1;
cin>>num;
int cot2=0;
int cot5 =0;
rep(i, 2, num)
{
int temp = i;
while(temp%2 == 0)
{
temp /= 2;
cot2++;
}
while(temp %5 == 0)
{
temp /= 5;
cot5++;
}
ans = (ans*temp)%10;
}
int x = abs(cot5- cot2);
rep(i, 1, x)
{
ans *= 2;
ans %= 10;
}
cout<<ans%10;
return 0;
}