天天看點

C++描述 AcWing 1381. 階乘

C++描述 AcWing 1381. 階乘

  大家好,我叫亓官劼(qí guān jié )

N 的階乘(記作 N!)是指從 1 到 N(包括 1 和 N)的所有整數的乘積。

階乘運算的結果往往都非常的大。

現在,給定數字 N,請你求出 N! 的最右邊的非零數字是多少。

例如 5!=1×2×3×4×5=120,是以 5! 的最右邊的非零數字是 2。

輸入格式

共一行,包含一個整數 N。

輸出格式

輸出一個整數,表示 N! 的最右邊的非零數字。

資料範圍

1≤N≤1000

輸入樣例:

7      

輸出樣例:

4      

解法一 - 直接模拟

#include<iostream>
using namespace std;
int main(){
    int n;
    cin >> n;
    int a = 1;
    for(int i = 1; i <= n; i++){
        // 防止溢出 取模
        a = (a*i) % 10000;
        while(a%10 == 0)
            a /= 10;
    }
    cout << a % 10;
    return 0;
}      

解法二 - 階乘分解

#include<iostream>
using namespace std;
int main(){
    int n;
    cin >> n;
    int a = 1,d2 = 0, d5 = 0;
    for(int i = 1; i <= n; i++){
        int x = i;
        while(x % 2 == 0){
            d2++;
            x /= 2;
        }
        while(x % 5 == 0){
            d5++;
            x /= 5;
        }
        a = (a*x) % 10;//隻保留個位即可 
    }
    //乘上之前未乘的因數2和5,當2和5同為因數時相乘為0,直接去掉
    for(int i = 0; i < d2 - d5; i++)
        a = (a * 2) % 10;
    cout << a;
    return 0;
}