Ce face std::gcd
std::gcd(a, b) returnează cel mai mare număr care îi divide pe amândoi; std::lcm(a, b) returnează cel mai mic număr divizibil cu amândoi. Ambele sunt în <numeric> și primesc doar tipuri întregi.
Semnul nu contează (se folosesc valorile absolute). gcd(0, n) este |n|, iar lcm(0, n) este 0. Pentru mai multe numere, combini cu std::accumulate sau std::reduce.
Parametri
| Parametru | Descriere |
|---|---|
m, n |
Două numere întregi. |
Ce returnează
Divizorul comun maxim, respectiv multiplul comun minim.
Exemple
Exemplul 1: Simplificarea unei fracții
#include <numeric>
#include <print>
int main() {
int numarator = 84;
int numitor = 126;
int d = std::gcd(numarator, numitor);
std::println("{}/{} = {}/{}", numarator, numitor, numarator / d, numitor / d);
}
Rezultat
84/126 = 2/3
Exemplul 2: Când pleacă autobuzele din nou împreună
Liniile pleacă la 12, 18 și 30 de minute; cel mai mic multiplu comun spune când coincid din nou.
#include <numeric>
#include <print>
#include <vector>
int main() {
std::vector<int> intervale{12, 18, 30};
int dupa = std::accumulate(intervale.begin(), intervale.end(), 1,
[](int a, int b) { return std::lcm(a, b); });
std::println("Pleacă din nou împreună după {} de minute", dupa);
std::println("gcd(-12, 18) = {}, gcd(0, 7) = {}", std::gcd(-12, 18), std::gcd(0, 7));
}
Rezultat
Pleacă din nou împreună după 180 de minute
gcd(-12, 18) = 6, gcd(0, 7) = 7
Greșeli frecvente
- Dai numere cu zecimale:
std::gcd(4.0, 6.0)nu compilează. lcmpe numere mari depășește limita tipului (comportament nedefinit). Foloseștelong long.
Comenzi înrudite
std::ratio: O fracție calculată la compilare (numărător/numitor), folosită pentru unități precum milisecunde sau kilometri.std::accumulate: Adună toate elementele unui interval pornind de la o valoare inițială (sau le combină cu o operație dată).std::fmod: Calculează restul împărțirii a două numere cu virgulă (echivalentul lui % pentru double).