算法训练 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
1 #include <iostream> 2 using namespace std; 3 //分析:决定末尾数字为0的就是2和5 4 int main(){ 5 long long int n; 6 cin >> n; 7 long long a = 0;//用来记录2的个数 8 long long b = 0;//用来记录5的个数 9 long long ans = 1;//用来记录个位非0数字 10 for(int i = 1; i < n + 1; i++){ 11 int t = i; 12 while(t % 2 == 0){//将2过滤 13 a++; 14 t /= 2; 15 } 16 while(t % 5 == 0){//将5过滤 17 b++; 18 t /= 5; 19 } 20 if(t){ 21 ans *= t; 22 } 23 ans %= 10; 24 } 25 if(a > b){ 26 switch((a - b) % 4){ //找到规律能被2整除的数 27 //2,4,6,8,10,12...个位数字依次是0,2,4,6,8)周期性出现 28 case 0: ans *= 6;break;//如果多出4个2那就是2的4次等于16取个位那就是6 29 case 1: ans *= 2;break; 30 case 2: ans *= 4;break; 31 case 3: ans *= 8;break; 32 default: break; 33 } 34 }else if (a < b){ 35 //处理多出来的5 36 //不管有多少5乘积的个位数字都是5 37 ans *= 5; 38 39 } 40 ans %= 10; 41 cout << ans << endl; 42 return 0; 43 }