plus grand diviseur commun dans un intervalle
Soit x et y deux nombres. Dans ce cas, x est dit diviseur de y si y renvoie un reste nul lorsqu’il est divisé par x. Le plus grand diviseur présent dans un intervalle est le diviseur du plus grand nombre d’éléments de l’intervalle.
Énoncé du problème
Étant donné un intervalle [a, b]. Recherchez le plus grand diviseur qui apparaît dans la plage contenant a et b (autre que « 1 »). Renvoie 1 si tous les diviseurs apparaissent le même nombre de fois.
Exemple 1
Input [2, 5]
Output 2
Explication - Diviseurs de 2 = {1, 2}, diviseurs de 3 = {1, 3}, diviseurs de 4 = {1, 2, 4}, diviseurs de 5 = {1, 5} . 2 est le diviseur le plus fréquent.
Exemple 2
Input [2, 5]
Output 2
Explication - Diviseurs de 2 = {1, 2}, diviseurs de 3 = {1, 3}, diviseurs de 4 = {1, 2, 4}, diviseurs de 5 = {1, 5} . 2 est le diviseur le plus fréquent.
Méthode 1 : Fissuration par force brute
Un moyen brutal de résoudre ce problème consiste à trouver tous les diviseurs de tous les nombres dans l'intervalle et à les stocker sur une carte avec le nombre d'occurrences.
Algorithme
Diviseur de processus (num)
Pour i = 1 à n1/2+1
Si num%i == 0
Si num/i == i
Si je ne suis pas sur la carte, insérez (i, 1)
Sinon map[i]++
Autres
Si je ne suis pas sur la carte, insérez (i, 1)
Sinon map[i]++
Si num/i n'est pas dans la carte, insérez (num/i, 1)
Autres cartes[num/i]++
Traitement maxDivisors (a, b)
pour n = a à b
Diviseur (n)
map.erase(1)
diviseur = 1, nombre = int_min
Pour chaque élément de la carte
if it.value > count
count = it.value
Diviseur = it.key
Exemple : implémentation C++
Dans le programme ci-dessous, nous trouvons le diviseur de chaque nombre dans la fonction divisors() et trouvons le plus grand diviseur existant dans la fonction maxdivisor().
#include <bits/stdc++.h> using namespace std; // map storing occurrence of each divisor unordered_map<int, int> occ; // function to find all the divisors of a number and store it in map void divisors(int num){ for (int i = 1; i <= (sqrt(num) + 1); i++) { // checking if i is divisor of num if (num % i == 0) { // checking if num has identical divisors i.e. if i*i == num // if identical divisors then save only one if (num / i == i) { if (occ.find(i) == occ.end()) { occ.insert(make_pair(i, 1)); } else{ occ[i]++; } } else{ // saving divisor i if (occ.find(i) == occ.end()) { occ.insert(make_pair(i, 1)); } else{ occ[i]++; } // saving the divisor of num corresponding to i if (occ.find(num / i) == occ.end()) { occ.insert(make_pair(num / i, 1)); } else{ occ[num / i]++; } } } } } // function to find maximum occurring divisor in an interval int maxDivisor(int a, int b){ for (int n = a; n <= b; n++){ divisors(n); } // deleting all occurrences of 1 as 1 is not to be returned until the interval is [1,1] occ.erase(1); // divisor set as 1 for edge case scenario when interval is [1,1] int div = 1, cnt = INT_MIN; for (auto it = occ.begin(); it != occ.end(); it++) { if (it->second > cnt) { cnt = it->second; div = it->first; } } return div; } int main(){ int a = 4, b = 7; cout << "For the interval [" << a << ", " << b << "] maximum occurring divisor = "; cout << maxDivisor(a, b); return 0; }
Sortie
For the interval [4, 7] maximum occurring divisor = 2
Complexité temporelle - O(n3/2), car pour chaque nombre de l'intervalle, pour trouver le diviseur, une boucle de complexité O(n1/2) est effectuée.
Complexité spatiale - O(n), espace cartographique.
Méthode 2
La méthode ci-dessus peut être encore optimisée en réduisant le temps nécessaire pour remplir la carte à chaque occurrence du diviseur. Au lieu de trouver le diviseur de chaque nombre, vous pouvez connaître l’occurrence de chaque diviseur dans l’intervalle en calculant les limites inférieure et supérieure de l’intervalle.
Prenons l'intervalle [2, 5] comme exemple.
L'ensemble des diviseurs possibles est de 1 à 5. Par conséquent, 1 = 5/1 - 2/1 +1 = 4 se produit. Il semble que 2 = 5/2 - 2/2 + 1 = 2. Il semble que 3 = 5/3 - 2/3 = 1. Il semble que 4 = 5/4 - 2/4 = 1. Il semble que 5 = 5/5 - 2/5 = 1.
Ce qui précède peut être formalisé comme suit :
Si limite inférieure% diviseur == 0 alors occ = limite supérieure/diviseur - limite inférieure/diviseur + 1
Autre occ = limite supérieure/diviseur - limite inférieure/diviseur
Algorithme
Traitement maxDivisor (a, b)
pour i = 2 à b
Si a%i == 0
Nombre de fois = b/i - a/i +1
Autres
Nombre de fois = b/i - a/i
map.insert(i, fois)
diviseur = 1, nombre = int_min
Pour chaque élément de la carte
if it.value > count
count = it.value
Diviseur = it.key
Exemple : implémentation C++
Dans le programme ci-dessous, au lieu de trouver les diviseurs d'un nombre dans l'ordre inverse, on trouve pour chaque diviseur combien de multiples il a dans l'intervalle.
#include <bits/stdc++.h> using namespace std; // function to find maximum occurring divisor in an interval int maxDivisor(int a, int b){ // map used to store occurrences of divisors unordered_map<int, int> occ; for (int i = 2; i <= b; i++){ int times; if (a % i == 0){ times = (b / i) - (a / i) + 1; } else{ times = (b / i) - (a / i); } occ.insert(make_pair(i, times)); } // divisor set as 1 for edge case scenario when interval is [1,1] int div = 1, cnt = INT_MIN; for (auto it = occ.begin(); it != occ.end(); it++){ if (it->second > cnt){ cnt = it->second; div = it->first; } } return div; } int main(){ int a = 1, b = 10; cout << "For the interval [" << a << ", " << b << "] maximum occurring divisor = "; cout << maxDivisor(a, b); return 0; }
Sortie
For the interval [1, 10] maximum occurring divisor = 2
Méthode 3
Une solution très simple à ce problème est présentée ci-dessous,
Dans tout intervalle de taille > 1, la moitié des nombres (chaque nombre pair) aura 2 comme diviseur.
Il peut donc être utilisé comme suit.
Algorithme
Traitement maxDivisors (a, b)
si a == b
ans = a
Autres
ans = 2
Exemple : implémentation C++
Dans le programme ci-dessous, nous implémentons l'observation selon laquelle tout nombre pair a 2 comme diviseur.
#include <bits/stdc++.h> using namespace std; // function to find the maximum occurring divisor in an interval int maxDivisor(int a, int b){ if (a == b){ return a; } else { return 2; } } int main(){ int a = 1, b = 10; cout << "For the interval [" << a << ", " << b << "] maximum occurring divisor = "; cout << maxDivisor(a, b); return 0; }
Sortie
For the interval [1, 10] maximum occurring divisor = 2
Conclusion
En bref, afin de trouver le plus grand diviseur présent dans un intervalle, nous pouvons utiliser la méthode ci-dessus, la plage temporelle va de O(n3/2) à O(1) et la plage spatiale va de O(n) à O (1).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Bien que la définition de macros de fonctions puisse simplifier le code et améliorer les performances, elle présente également des inconvénients : insécurité des types, difficultés de débogage, conflits de noms et redondance du code. Après avoir pesé le pour et le contre, il est crucial de prendre des décisions éclairées lors de l’utilisation des macros de fonctions.

Explication détaillée de la méthode de recherche du plus grand diviseur commun en langage C Le plus grand diviseur commun (PGCD, Greatest Common Divisor) est un concept couramment utilisé en mathématiques, qui fait référence au plus grand diviseur parmi plusieurs entiers. En langage C, nous pouvons utiliser de nombreuses méthodes pour trouver le plus grand diviseur commun. Cet article détaillera plusieurs de ces méthodes courantes et fournira des exemples de code spécifiques. Méthode 1 : La division euclidienne est une méthode classique pour trouver le plus grand commun diviseur de deux nombres. Son idée de base est de diviser continuellement les diviseurs et les restes de deux nombres.

Le mécanisme d'appel de fonction en C++ consiste à transmettre des arguments à une fonction et à exécuter son code, en renvoyant le résultat s'il existe. Il existe deux manières de transmettre des paramètres : passer par valeur (les modifications sont effectuées à l'intérieur de la fonction) et passer par référence (les modifications sont reflétées dans l'appelant). Lors du passage de valeur, les modifications de valeur au sein de la fonction n'affectent pas la valeur d'origine (telle que printValue), tandis que les modifications lors du passage de référence affectent la valeur d'origine (telle que printReference).

Auteur original : 0xSea.eth Avec une hauteur de bloc de 840 000, Bitcoin marquera le début de sa quatrième réduction de moitié, avec une récompense de bloc réduite de 6,25 BTC à 3,125 BTC. Il s'agit d'un événement majeur auquel l'ensemble du secteur du cryptage est attentif. Au sein de l’écosystème Bitcoin, presque tout le monde prête attention au protocole Runes, qui sera mis en ligne avec une hauteur de bloc de 840 000. Comment le protocole Runes va-t-il changer le paysage de l’écosystème du protocole de couche Bitcoin ? Quel impact cela aura-t-il sur BRC-20, Atomics et d’autres protocoles ? En tant qu'observateur et joueur, à la veille du halving et du lancement des Runes, je voudrais faire le tri dans certaines de mes réflexions récentes sur le marché. Le protocole de jeton à une couche Core Viewpoint 1/Bitcoin formera BRC-20, Atomi

Le plus grand diviseur commun peut être trouvé en utilisant l'algorithme euclidien en langage C. Le principe est le suivant : le plus grand commun diviseur de deux entiers a et b est égal au reste de a divisé par b et au plus grand commun diviseur de c et b. Cet algorithme est très efficace et peut résoudre rapidement même lorsqu'il s'agit de grands nombres.

Dans cet article, nous visons à explorer une question fascinante sur le plus grand diviseur commun (PGCD) des tableaux dans plusieurs langages de programmation, en nous concentrant sur le C++. Nous démontrerons une approche algorithmique qui utilise des échanges d'éléments par paires et le nombre de leurs produits pour vérifier s'il est possible d'améliorer GCD au-dessus de 1. De plus, nous proposerons d’autres manières de résoudre ce problème, chacune avec sa définition syntaxique. En plus de ces solutions, nous présenterons également deux codes exécutables complets contenant ces méthodes. Syntaxe Pour garantir une compréhension claire des exemples de code qui suivent, nous devons évaluer et comprendre la syntaxe utilisée avant de le faire. #include<iostream>#include<vecto

Titre : Utilisez la programmation en langage C pour implémenter la solution du plus grand diviseur commun. Le plus grand diviseur commun (Greatest Common Divisor, GCD en abrégé) fait référence au plus grand entier positif qui peut diviser deux entiers ou plus en même temps. La recherche du plus grand diviseur commun peut être très utile pour certains algorithmes et la résolution de problèmes. Dans cet article, la fonction de recherche du plus grand diviseur commun sera implémentée via la programmation en langage C, et des exemples de code spécifiques seront fournis. En langage C, vous pouvez utiliser l'algorithme euclidien pour résoudre le maximum

Introduction à l'algorithme permettant de trouver le plus grand diviseur commun en langage C : Le plus grand diviseur commun (Greatest Common Divisor, GCD en abrégé) est un concept courant en mathématiques, qui fait référence au plus grand diviseur commun de deux entiers ou plus. En informatique, trouver le plus grand diviseur commun est une exigence courante. Cet article explorera plusieurs algorithmes pour trouver le plus grand diviseur commun en langage C et fournira des exemples de code spécifiques. 1. Algorithme euclidien (méthode de division euclidienne) : l'algorithme euclidien est un algorithme ancien et simple qui divise à plusieurs reprises deux
