Algoritmi elementari

Câte zerouri are n factorial la final? C++

Numără zerourile de la sfârșitul lui n factorial fără să calculezi produsul. Explică factorii 5, 25 și 125 și testează inclusiv zero.

Factorialul lui n, notat n!, este produsul numerelor de la 1 la n. Prin convenție, 0!=1. Pentru 10, produsul este 3628800 și are două zerouri la sfârșit. Calcularea întregului produs devine repede imposibilă într-un tip numeric obișnuit, dar zerourile pot fi numărate fără produs.

Un zero vine dintr-un factor 10

Fiecare factor 10 se descompune în 2·5. În factorial sunt cel puțin la fel de mulți factori 2 ca factori 5. Numărul perechilor 2·5 este deci dat de numărul factorilor 5. Nu numărăm cifrele zero din scrierea lui n, ci factorii primi din toate numerele înmulțite.

Multiplii lui 5 aduc câte un factor 5. Multiplii lui 25 mai aduc unul, deoarece 25=5². Multiplii lui 125 aduc încă unul. Pentru 30!, calculul este ⌊30/5⌋+⌊30/25⌋=6+1=7. Simbolul ⌊x⌋ înseamnă partea întreagă inferioară; aici împărțirea întreagă a numerelor naturale face exact acest lucru.

Împărțiri repetate, fără puteri

Citim 0≤n≤10^18. Împărțim copia lui n la 5 și adunăm câtul, apoi repetăm cu acel cât. Astfel obținem succesiv ⌊n/5⌋, ⌊n/25⌋ și celelalte valori necesare, fără să construim o putere care ar putea depăși tipul.

Multiplii lui 5 până la 30 aduc șase factori 5. Numărul 25 aduce încă unul. Totalul este șapte zerouri finale.Multiplii lui 5 până la 30 aduc șase factori 5. Numărul 25 aduce încă unul. Totalul este șapte zerouri finale.Mărește schema ↗

#include <iostream>
using namespace std;
int main() {
    long long n; cin >> n;
    long long zerouri=0;
    while(n>0) {
        n/=5;
        zerouri+=n;
    }
    cout << zerouri << '\n';
}

De ce 25 se numără de două ori

La prima împărțire, 25 apare în grupul multiplilor lui 5. La a doua, apare în grupul multiplilor lui 25. Acest lucru nu dublează un obiect din greșeală: numărul 25 contribuie cu doi factori 5 diferiți în produs. Pentru 125 există trei contribuții.

Suma este mai mică decât n/4 pentru n pozitiv, prin comparație cu seria n/5+n/25+… . Pentru limita declarată, rezultatul încape în long long. Numărul de pași este O(log₅(n+1)), deoarece n se împarte la 5 la fiecare iterație. Memoria este O(1), un număr fix de variabile.

Exersează

Pentru 0, 4, 5, 10, 25 și 30, răspunsurile sunt 0, 0, 1, 2, 6 și 7. Compară 24! și 25!: numărul zerourilor crește de la 4 la 6, nu doar cu unu. Explică saltul folosind descompunerea lui 25. Ca extensie, urmărește saltul dintre 124! și 125!.

Revezi factorii primi, împărțirea întreagă și factorialul recursiv pentru a separa valoarea produsului de o proprietate a lui.

Întrebări frecvente

Cum număr zerourile de la sfârșitul lui n factorial?

Adună câturile întregi n/5, n/25, n/125 și așa mai departe, cât timp sunt nenule. Ele numără factorii 5 din produs, care formează factori 10 împreună cu factorii 2 disponibili.

De ce multiplii lui 25 contribuie cu două zerouri?

Un multiplu al lui 25 conține cel puțin doi factori 5. Este numărat o dată între multiplii lui 5 și încă o dată între multiplii lui 25. Factorii 2 necesari există în factorial.

Trebuie să calculez factorialul pentru a-i număra zerourile?

Nu. Numărarea factorilor 5 evită produsul foarte mare. Pentru 0!, valoarea este 1 și numărul zerourilor finale este 0.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →