算法训练 P0505
时间限制:1.0s 内存限制:256.0MB
一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5!=1*2*3*4*5=120,因此5!最右边的那个非0的数字是2。再如,7!=5040,因此7!最右边的那个非0的数字是4。再如,15!= 1307674368000,因此15!最右边的那个非0的数字是8。请编写一个程序,输入一个整数n(0<n<=100),然后输出n!最右边的那个非0的数字是多少。
输入:
7
输出:
4
输入:
7
输出:
4
#include <iostream>
using namespace std;
//分析:决定末尾数字为0的就是2和5
int main(){
long long int n;
cin >> n;
long long a = ;//用来记录2的个数
long long b = ;//用来记录5的个数
long long ans = ;//用来记录个位非0数字
for(int i = ; i < n + ; i++){
int t = i;
while(t % == ){//将2过滤
a++;
t /= ;
}
while(t % == ){//将5过滤
b++;
t /= ;
}
if(t){
ans *= t;
}
ans %= ;
}
if(a > b){
switch((a - b) % ){ //找到规律能被2整除的数
//2,4,6,8,10,12...个位数字依次是0,2,4,6,8)周期性出现
case : ans *= ;break;//如果多出4个2那就是2的4次等于16取个位那就是6
case : ans *= ;break;
case : ans *= ;break;
case : ans *= ;break;
default: break;
}
}else if (a < b){
//处理多出来的5
//不管有多少5乘积的个位数字都是5
ans *= ; }
ans %= ;
cout << ans << endl;
return ;
}