Table des matières
Énoncé du problème
Exemple 2
Méthode 1 : Fissuration par force brute
Algorithme
Exemple : implémentation C++
Sortie
Méthode 3
Conclusion
Maison développement back-end C++ plus grand diviseur commun dans un intervalle

plus grand diviseur commun dans un intervalle

Sep 01, 2023 am 10:09 AM
最大公约数 intervalle

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]
Copier après la connexion
Copier après la connexion
Output 2
Copier après la connexion
Copier après la connexion

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]
Copier après la connexion
Copier après la connexion
Output 2
Copier après la connexion
Copier après la connexion

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;
}
Copier après la connexion

Sortie

For the interval [4, 7] maximum occurring divisor = 2
Copier après la connexion

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;
}
Copier après la connexion

Sortie

For the interval [1, 10] maximum occurring divisor = 2
Copier après la connexion
Copier après la connexion

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;
}
Copier après la connexion

Sortie

For the interval [1, 10] maximum occurring divisor = 2
Copier après la connexion
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Quels sont les avantages et les inconvénients de la définition des macros de fonctions C++ ? Quels sont les avantages et les inconvénients de la définition des macros de fonctions C++ ? Apr 11, 2024 pm 04:54 PM

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 façon d'utiliser le langage C pour trouver le plus grand diviseur commun Explication détaillée de la façon d'utiliser le langage C pour trouver le plus grand diviseur commun Feb 18, 2024 pm 11:10 PM

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.

Explication détaillée du mécanisme d'appel de fonction C++ Explication détaillée du mécanisme d'appel de fonction C++ Apr 11, 2024 pm 02:12 PM

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).

Bilan des trois pays qui tuent le protocole Bitcoin layer 1 : BRC-20, Atomics, Runes Bilan des trois pays qui tuent le protocole Bitcoin layer 1 : BRC-20, Atomics, Runes Apr 23, 2024 pm 02:01 PM

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

Comment trouver le plus grand diviseur commun en langage C Comment trouver le plus grand diviseur commun en langage C Sep 27, 2023 am 09:41 AM

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.

Vérifiez si le plus grand diviseur commun d'un tableau peut être rendu supérieur à 1 en remplaçant les paires par leur produit Vérifiez si le plus grand diviseur commun d'un tableau peut être rendu supérieur à 1 en remplaçant les paires par leur produit Aug 31, 2023 pm 06:49 PM

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

Utiliser la programmation en langage C pour résoudre le plus grand diviseur commun Utiliser la programmation en langage C pour résoudre le plus grand diviseur commun Feb 21, 2024 pm 07:30 PM

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

Recherche sur l'algorithme de recherche du plus grand diviseur commun en langage C Recherche sur l'algorithme de recherche du plus grand diviseur commun en langage C Feb 22, 2024 pm 11:36 PM

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

See all articles