1. 程式人生 > >51nod1003階乘後邊0的數量

51nod1003階乘後邊0的數量

題目描述  連結戳這裡

解法:

《程式設計之美》書裡有講

N!能產生0的質數組合只能是2 * 5,也就是說當對N!進行質數分解之後

N!末尾 0 的個數取決於從 1 到 n 的各個數的因子中 2 和 5 的個數的較小的那個,但又因為能被2整除的數出現的頻率比能被5整除的數高得多,且出現一個5的時,最少會同時出現一個2,所以最小值就是5出現的個數。即求出5出現的個數就可以得到N!末尾0的個數。

求5出現的個數 

n的階乘 就是 1x2x3x4x5x6........xn  

各個因子中5的個數 就是  n累除以5  得到的數字累加  直到 得到0

比如  25 = 1x2x3x4x5x6......x25  這裡面每個數進行質因數分解 會得到6個五,其中5,10,15,20各自有一個  25有兩個

25/5 =5   5/5=1  1/5=0    5+1+0=6;

為什麼 這樣解呢   因為  分解質因數後  5,10,15,20各自貢獻一個  25貢獻兩個  125 貢獻三個  以此類推

所以  這裡面出現的5的次數 就是  =【n/5】+【n/25】+【n/125】......

所以就是n累除5 計數就好了

程式碼

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
const int maxn=1e5+7;
typedef long long ll;
ll n;
int main(){
    scanf("%lld",&n);
    ll sum=0;
    while(n){
        sum+=n/5;
        n/=5;
    }
    printf("%lld",sum);
    return 0;
}