La fonction std::gcd en C++
-
Utilisez la fonction
std::gcdpour calculer le plus grand diviseur commun de deux entiers en C++ -
Utilisez la fonction
std::lcmpour calculer le plus petit commun multiple de deux entiers en C++ -
Utilisez la fonction
std::midpointpour calculer le point médian de deux nombres en C++
Cet article expliquera comment utiliser std::gcd et d’autres fonctions mathématiques utiles de la bibliothèque numérique STL en C++.
Utilisez la fonction std::gcd pour calculer le plus grand diviseur commun de deux entiers en C++
STL fournit plusieurs algorithmes utilisant l’en-tête <algorithm>, mais il fournit également de puissantes fonctions mathématiques, dont certaines peuvent être considérées comme des algorithmes numériques. Ces fonctions sont fournies à l’aide de l’en-tête - numeric.
Nous allons explorer la fonction std::gcd qui calcule le plus grand commun diviseur de deux entiers. Un plus grand diviseur commun est le plus grand entier positif qui divise chacun des entiers donnés.
std::gcd prend deux valeurs entières (m et n) et renvoie le plus grand diviseur commun de |m| et |n|. Si m et n ont tous deux zéro, la fonction renvoie également zéro. L’exemple de code suivant illustre l’utilisation de base de std::gcd et imprime les résultats correspondants sur la console.
#include <iomanip>
#include <iostream>
#include <numeric>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
int main() {
std::vector<std::pair<int, int>> vec = {
{12125, 1235}, {124, 1122}, {-1235, 321}, {12, 144}};
for (const auto &item : vec) {
cout << "Greatest common divisor of " << setw(5) << item.first << " and "
<< setw(5) << item.second << " is "
<< std::gcd(item.first, item.second) << endl;
}
return EXIT_SUCCESS;
}
Production:
Greatest common divisor of 12125 and 1235 is 5
Greatest common divisor of 124 and 1122 is 2
Greatest common divisor of -1235 and 321 is 1
Greatest common divisor of 12 and 144 is 1
Utilisez la fonction std::lcm pour calculer le plus petit commun multiple de deux entiers en C++
Une autre fonction similaire fournie dans la bibliothèque numérique est std::lcm, qui calcule le plus petit commun multiple de deux entiers. La fonction accepte deux entiers similaires au std:gcd et renvoie le plus petit commun multiple de |m| et |n| (indiquant les arguments).
Notez que ces deux fonctions ont un spécificateur constexpr, ce qui implique qu’il est possible qu’elles soient utilisées dans des expressions constantes, et que la fonction obtient également une classification en ligne.
#include <iomanip>
#include <iostream>
#include <numeric>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
int main() {
std::vector<std::pair<int, int>> vec = {
{12125, 1235}, {124, 1122}, {-1235, 321}, {12, 144}};
for (const auto &item : vec) {
cout << "Least common multiple of " << setw(5) << item.first << " and "
<< setw(5) << item.second << " is "
<< std::lcm(item.first, item.second) << endl;
}
return EXIT_SUCCESS;
}
Production:
Least common multiple of 12125 and 1235 is 2994875
Least common multiple of 124 and 1122 is 69564
Least common multiple of -1235 and 321 is 396435
Least common multiple of 12 and 144 is 144
Utilisez la fonction std::midpoint pour calculer le point médian de deux nombres en C++
std::midpoint est une fonction capable de calculer la moitié de deux nombres donnés sans que l’utilisateur se soucie des débordements. A savoir, si nous essayons de calculer la moitié de deux grands entiers, dont la somme est supérieure à la limite supérieure de l’entier 64 bits, alors nous obtenons le débordement et le résultat sera incorrect.
À titre d’exemple, l’extrait de code suivant essaie de trouver le milieu de deux entiers, où l’un est le même que le nombre maximum pouvant être stocké dans uint64_t, et l’autre est inférieur de dix. Notez que le calcul utilisant les opérateurs arithmétiques habituels donne le mauvais nombre tandis que std::midpoint renvoie le résultat correct.
Notez cependant que cette fonction fait partie du langage depuis la norme C++20 et peut ne pas être disponible sur les anciennes versions. std::midpoint fonctionne également sur les valeurs de pointeur, mais les pointeurs donnés doivent être des éléments du même tableau. Sinon, le comportement n’est pas défini.
#include <iomanip>
#include <iostream>
#include <numeric>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
int main() {
uint64_t a = std::numeric_limits<uint64_t>::max();
uint64_t b = std::numeric_limits<uint64_t>::max() - 10;
cout << "a: " << a << '\n'
<< "b: " << b << '\n'
<< "Incorrect: " << setw(20) << (a + b) / 2 << '\n'
<< "Correct : " << setw(20) << std::midpoint(a, b) << endl;
return EXIT_SUCCESS;
}
Production:
a: 18446744073709551615
b: 18446744073709551605
Incorrect: 9223372036854775802
Correct : 18446744073709551610
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook