欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

P1134 阶乘问题 AC于2018.8.18 https://www.luogu.org/problemnew/show/P1134

程序员文章站 2024-03-20 11:02:58
...

题目描述

也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:

12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600

12 的阶乘最右边的非零位为 66 。

写一个程序,计算 N(1≤N≤50,000,000) 阶乘的最右边的非零位的值。

注意: 10,000,000! 有2499999 个零。

输入输出格式

输入格式:

仅一行包含一个正整数 N 。

输出格式:

一个整数,表示最右边的非零位的值。

输入输出样例

输入样例#1: 

12

输出样例#1: 

6

说明

USACO Training Section 3.2

 

【思路】

N!的末尾只会是2,4,6,8(在此题中没有0).

[2,4,6,8]中任意一个数乘6,末尾仍是本身.2 * 6 = 12,末尾为2, 4 * 6 =24,末尾为4, 6 * 6=36,末尾为6,8 * 6 =48,末尾为8.

末尾数字只受末尾数字影响,如4. 4 * 6得到的末尾数字与4 * 16的末尾数字一样.

4 * 10=40,末尾数字为4(此题不要末尾0).则4 * 2 *8==4 * 2 *5(意思是得到的末尾数字是一样的).

故所有乘5的时候都可以换为乘8.又多次乘8末尾是有规律的.找出规律即可.

#include <cstdio>
using namespace std;
int n,ans=1;
int a[4]= {6,8,4,2};
int main() 
{
    scanf("%d",&n);
    while (n>0) 
    {
        for(int i=1;i<=n%10;i++)
        if(i!=5) 
        ans=ans*i%10;
        n=n/5;
        ans=ans*a[n%4]%10;
    }
    printf("%d",ans);
    return 0;
}