P0505

  算法训练 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
 
 
 
 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 } 

 

 

posted @ 2019-03-18 19:19  kakaluotedj  阅读(261)  评论(0编辑  收藏  举报