USACO 3.2 Factorials

USACO 3.2 Factorials


这题主要是去掉阶乘末尾的0。是个老题了,编程之美中就有讨论。因为0都是由2*5得来的。只要找出乘数中有多少个2*5对就行了。
因为2的个数远多于5,所以只要找出5的个数即可。因为n最大为4220,5的个数为:
n/5+n/5/5+n/5/5/5+n/5/5/5/5+n/5/5/5/5/5+n/5/5/5/5/5/5;
然后再去除相应数目的2。这样剩下的数只需两两相乘后取最后一位即可。

#include  < iostream >
#include 
< fstream >

using   namespace  std;

ifstream in(
" fact4.in " );
ofstream out(
" fact4.out " );

void  solve()
{
    
int  n;
    
in >> n;

    
int  numof5  =  n / 5 + n / 5 / 5 + n / 5 / 5 / 5 + n / 5 / 5 / 5 / 5 + n / 5 / 5 / 5 / 5 / 5 + n / 5 / 5 / 5 / 5 / 5 / 5 ;

    
int  res  =   1 ;

    
int  tmp;

    
for ( int  i = 1 ;i <= n; ++ i){
        tmp 
=  i;
        
while (tmp % 5 == 0 ) tmp /= 5 ;
        
while (tmp % 2 == 0 && numof5 != 0 ){
            tmp
/= 2 ;
            numof5
-- ;
        }
        res
*= tmp;
        res
%= 10 ;
    }

    
out << res << endl;
}

int  main( int  argc, char   * argv[])
{
    solve(); 
    
return   0 ;
}


原题:
Factorials

The factorial of an integer N, written N!, is the product of all the integers from 1 through N inclusive. The factorial quickly becomes very large: 13! is too large to store in a 32-bit integer on most computers, and 70! is too large for most floating-point variables. Your task is to find the rightmost non-zero digit of n!. For example, 5! = 1 * 2 * 3 * 4 * 5 = 120, so the rightmost non-zero digit of 5! is 2. Likewise, 7! = 1 * 2 * 3 * 4 * 5 * 6 * 7 = 5040, so the rightmost non-zero digit of 7! is 4.

PROGRAM NAME: fact4

INPUT FORMAT

A single positive integer N no larger than 4,220.

SAMPLE INPUT (file fact4.in)

7

OUTPUT FORMAT

A single line containing but a single digit: the right most non-zero digit of N! .

SAMPLE OUTPUT (file fact4.out)

4

你可能感兴趣的:(USACO 3.2 Factorials)