Inhaltsverzeichnis
Problemstellung
Beispiel 2
Methode 1: Brute-Force-Cracking
Algorithmus
Beispiel: C++-Implementierung
Ausgabe
Methode 3
Fazit
Heim Backend-Entwicklung C++ größter gemeinsamer Teiler in einem Intervall

größter gemeinsamer Teiler in einem Intervall

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

größter gemeinsamer Teiler in einem Intervall

Seien x und y zwei Zahlen. In diesem Fall wird x als Teiler von y bezeichnet, wenn y bei der Division durch x einen Rest von Null zurückgibt. Der größte in einem Intervall vorkommende Teiler ist der Teiler der größten Anzahl von Elementen im Intervall.

Problemstellung

Gegebenes Intervall [a, b]. Finden Sie den größten Teiler, der in dem Bereich auftritt, der a und b enthält (außer „1“). Gibt 1 zurück, wenn alle Teiler gleich oft vorkommen.

Beispiel 1

Input [2, 5]
Nach dem Login kopieren
Nach dem Login kopieren
Output 2
Nach dem Login kopieren
Nach dem Login kopieren

Erklärung - Teiler von 2 = {1, 2}, Teiler von 3 = {1, 3}, Teiler von 4 = {1, 2, 4}, Teiler von 5 = {1, 5}. 2 ist der häufigste Teiler.

Beispiel 2

Input [2, 5]
Nach dem Login kopieren
Nach dem Login kopieren
Output 2
Nach dem Login kopieren
Nach dem Login kopieren

Erklärung - Teiler von 2 = {1, 2}, Teiler von 3 = {1, 3}, Teiler von 4 = {1, 2, 4}, Teiler von 5 = {1, 5}. 2 ist der häufigste Teiler.

Methode 1: Brute-Force-Cracking

Eine Brute-Force-Methode zur Lösung dieses Problems besteht darin, alle Teiler aller Zahlen im Intervall zu finden und sie zusammen mit der Anzahl der Vorkommen in einer Karte zu speichern.

Algorithmus

Prozessdivisor (num)

  • Für i = 1 bis n1/2+1

  • Wenn num%i == 0

  • Wenn num/i == i

  • Wenn i nicht in der Karte ist, fügen Sie (i, 1) ein

  • Ansonsten Karte[i]++

  • Andere

  • Wenn i nicht in der Karte ist, fügen Sie (i, 1) ein

  • Ansonsten Karte[i]++

  • Wenn num/i nicht in der Karte ist, fügen Sie (num/i, 1) ein

  • Andere Karten[num/i]++

MaxDivisors (a, b) verarbeiten

  • für n = a bis b

  • Teiler (n)

  • map.erase(1)

  • divisor = 1, count = int_min

  • Für jedes Element in der Karte

  • if it.value > count

  • count = it.value

  • Divisor = it.key

Beispiel: C++-Implementierung

Im folgenden Programm ermitteln wir den Teiler jeder Zahl in der Funktion divisors() und den maximal auftretenden Teiler in der Funktion 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;
}
Nach dem Login kopieren

Ausgabe

For the interval [4, 7] maximum occurring divisor = 2
Nach dem Login kopieren

Zeitliche Komplexität – O(n3/2), da für jede Zahl im Intervall eine Schleife der Komplexität O(n1/2) durchgeführt wird, um den Teiler zu finden.

Raumkomplexität – O(n), Kartenraum.

Methode 2

Die obige Methode kann weiter optimiert werden, indem die Zeit zum Füllen der Karte bei jedem Auftreten des Divisors verkürzt wird. Anstatt den Teiler jeder Zahl zu ermitteln, können Sie das Vorkommen jedes Teilers im Intervall ermitteln, indem Sie die Unter- und Obergrenze des Intervalls berechnen.

Nehmen wir als Beispiel das Intervall [2, 5].

Die Menge der möglichen Teiler reicht von 1 bis 5. Daher tritt 1 = 5/1 - 2/1 +1 = 4 auf. Es scheint, dass 2 = 5/2 - 2/2 + 1 = 2. Es scheint, dass 3 = 5/3 - 2/3 = 1. Es scheint, dass 4 = 5/4 – 2/4 = 1. Es scheint, dass 5 = 5/5 – 2/5 = 1.

Das Obige kann wie folgt formalisiert werden:

Wenn Untergrenze %-Divisor == 0, dann occ = Obergrenze/Divisor - Untergrenze/Divisor + 1

Other occ = obere Grenze/Divisor – untere Grenze/Divisor

Algorithmus

MaxDivisor (a, b) verarbeiten

  • für i = 2 bis b

  • Wenn a%i == 0

  • Anzahl der Male = b/i - a/i +1

  • Andere

  • Anzahl der Male = b/i - a/i

  • map.insert(i, times)

  • divisor = 1, count = int_min

  • Für jedes Element in der Karte

  • if it.value > count

  • count = it.value

  • Divisor = it.key

Beispiel: C++-Implementierung

Im folgenden Programm ermitteln wir nicht die Teiler einer Zahl in umgekehrter Reihenfolge, sondern ermitteln für jeden Teiler, wie viele Vielfache er im Intervall hat.

#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;
}
Nach dem Login kopieren

Ausgabe

For the interval [1, 10] maximum occurring divisor = 2
Nach dem Login kopieren
Nach dem Login kopieren

Methode 3

Eine sehr einfache Lösung für dieses Problem wird unten gezeigt,

In jedem Intervall mit einer Größe > 1 hat die Hälfte der Zahlen (jede gerade Zahl) 2 als Teiler.

So kann es wie folgt verwendet werden.

Algorithmus

MaxDivisors (a, b) verarbeiten

  • wenn a == b

  • ans = a

  • Andere

  • ans = 2

Beispiel: C++-Implementierung

Im folgenden Programm setzen wir die Beobachtung um, dass jede gerade Zahl 2 als Teiler hat.

#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;
}
Nach dem Login kopieren

Ausgabe

For the interval [1, 10] maximum occurring divisor = 2
Nach dem Login kopieren
Nach dem Login kopieren

Fazit

Kurz gesagt, um den größten vorkommenden Teiler in einem Intervall zu finden, können wir die obige Methode verwenden. Der Zeitbereich reicht von O(n3/2) bis O(1) und der Raumbereich reicht von O(n). zu O( 1).

Das obige ist der detaillierte Inhalt vongrößter gemeinsamer Teiler in einem Intervall. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Vor- und Nachteile der C++-Funktionsmakrodefinition? Was sind die Vor- und Nachteile der C++-Funktionsmakrodefinition? Apr 11, 2024 pm 04:54 PM

Obwohl die Definition von Funktionsmakros den Code vereinfachen und die Leistung verbessern kann, weist sie auch Nachteile auf: Typunsicherheit, Schwierigkeiten beim Debuggen, Namenskonflikte und Coderedundanz. Nach Abwägung der Vor- und Nachteile ist es wichtig, fundierte Entscheidungen bei der Verwendung von Funktionsmakros zu treffen.

Ausführliche Erklärung, wie man die Sprache C verwendet, um den größten gemeinsamen Teiler zu finden Ausführliche Erklärung, wie man die Sprache C verwendet, um den größten gemeinsamen Teiler zu finden Feb 18, 2024 pm 11:10 PM

Ausführliche Erläuterung der Methode zum Ermitteln des größten gemeinsamen Teilers in der Sprache C. Der größte gemeinsame Teiler (GCD, Greatest Common Divisor) ist ein in der Mathematik häufig verwendetes Konzept, das sich auf den größten Teiler unter mehreren ganzen Zahlen bezieht. In der Sprache C können wir viele Methoden verwenden, um den größten gemeinsamen Teiler zu finden. In diesem Artikel werden einige dieser gängigen Methoden detailliert beschrieben und spezifische Codebeispiele bereitgestellt. Methode 1: Die euklidische Division ist eine klassische Methode zum Ermitteln des größten gemeinsamen Teilers zweier Zahlen. Seine Grundidee besteht darin, die Teiler und Reste zweier Zahlen kontinuierlich zu dividieren

Detaillierte Erläuterung des C++-Funktionsaufrufmechanismus Detaillierte Erläuterung des C++-Funktionsaufrufmechanismus Apr 11, 2024 pm 02:12 PM

Der Funktionsaufrufmechanismus in C++ umfasst die Übergabe von Argumenten an eine Funktion und die Ausführung ihres Codes sowie die Rückgabe des Ergebnisses, sofern vorhanden. Es gibt zwei Möglichkeiten, Parameter zu übergeben: Übergabe als Wert (Änderungen werden innerhalb der Funktion vorgenommen) und Übergabe als Referenz (Änderungen werden im Aufrufer widergespiegelt). Bei der Wertübergabe wirken sich Wertänderungen innerhalb der Funktion nicht auf den ursprünglichen Wert aus (z. B. printValue), während Änderungen bei der Referenzübergabe den ursprünglichen Wert beeinflussen (z. B. printReference).

So finden Sie den größten gemeinsamen Teiler in der C-Sprache So finden Sie den größten gemeinsamen Teiler in der C-Sprache Sep 27, 2023 am 09:41 AM

Der größte gemeinsame Teiler kann mithilfe des euklidischen Algorithmus in der Sprache C ermittelt werden. Das Prinzip lautet: Der größte gemeinsame Teiler zweier ganzen Zahlen a und b ist gleich dem Rest von a dividiert durch b und dem größten gemeinsamen Teiler von c und b. Dieser Algorithmus ist sehr effizient und kann selbst bei großen Zahlen schnell lösen.

Eine Bestandsaufnahme der drei Länder, die das Bitcoin-Layer-1-Protokoll vernichten: BRC-20, Atomics, Runes Eine Bestandsaufnahme der drei Länder, die das Bitcoin-Layer-1-Protokoll vernichten: BRC-20, Atomics, Runes Apr 23, 2024 pm 02:01 PM

Ursprünglicher Autor: 0xSea.eth Bei einer Blockhöhe von 840.000 wird Bitcoin seine vierte Halbierung einläuten, wobei die Blockbelohnung von 6,25 BTC auf 3,125 BTC reduziert wird. Dies ist ein wichtiges Ereignis, auf das die gesamte Kryptowährungsbranche achtet. Innerhalb des Bitcoin-Ökosystems achtet fast jeder auf das Runes-Protokoll, das mit der Blockhöhe von 840.000 online gehen wird. Wie wird das Runes-Protokoll die Landschaft des Bitcoin-Layer-Protokoll-Ökosystems verändern? Welche Auswirkungen wird es auf BRC-20, Atomics und andere Protokolle haben? Als Beobachter und Spieler möchte ich am Vorabend der Halbierung und Einführung von Runes einige meiner jüngsten Gedanken zum Markt darlegen. Das einschichtige Token-Protokoll von Core Viewpoint 1/Bitcoin wird BRC-20, Atomi, bilden

Verwenden der C-Sprachprogrammierung zur Lösung des größten gemeinsamen Teilers Verwenden der C-Sprachprogrammierung zur Lösung des größten gemeinsamen Teilers Feb 21, 2024 pm 07:30 PM

Titel: Verwenden Sie die C-Sprachprogrammierung, um die Lösung für den größten gemeinsamen Teiler zu implementieren. Der größte gemeinsame Teiler (kurz: Greatest Common Divisor, GCD) bezieht sich auf die größte positive ganze Zahl, die zwei oder mehr ganze Zahlen gleichzeitig teilen kann. Die Lösung nach dem größten gemeinsamen Teiler kann für einige Algorithmen und die Problemlösung sehr hilfreich sein. In diesem Artikel wird die Funktion zum Ermitteln des größten gemeinsamen Teilers durch C-Sprachprogrammierung implementiert und spezifische Codebeispiele bereitgestellt. In der Sprache C können Sie den Euklidischen Algorithmus verwenden, um das Maximum zu lösen

Überprüfen Sie, ob der größte gemeinsame Teiler in einem Array größer als 1 gemacht werden kann, indem Paare durch ihr Produkt ersetzt werden Überprüfen Sie, ob der größte gemeinsame Teiler in einem Array größer als 1 gemacht werden kann, indem Paare durch ihr Produkt ersetzt werden Aug 31, 2023 pm 06:49 PM

In diesem Artikel wollen wir einer faszinierenden Frage zum größten gemeinsamen Teiler (GCD) von Arrays in verschiedenen Programmiersprachen nachgehen und uns dabei auf C++ konzentrieren. Wir werden einen algorithmischen Ansatz demonstrieren, der den paarweisen Elementaustausch und die Anzahl ihrer Produkte nutzt, um zu überprüfen, ob es möglich ist, den GCD über 1 zu verbessern. Darüber hinaus werden wir weitere Möglichkeiten zur Lösung dieses Problems mit jeweils eigener Syntaxdefinition bereitstellen. Zusätzlich zu diesen Lösungen stellen wir auch zwei vollständige ausführbare Codes vor, die diese Methoden enthalten. Syntax Um ein klares Verständnis der folgenden Codebeispiele zu gewährleisten, müssen wir zuvor die verwendete Syntax bewerten und verstehen. #include<iostream>#include<vecto

Entwerfen Sie eine in C-Sprache geschriebene Funktion, um den größten gemeinsamen Teiler zu finden Entwerfen Sie eine in C-Sprache geschriebene Funktion, um den größten gemeinsamen Teiler zu finden Feb 19, 2024 pm 10:27 PM

Die C-Sprache ist eine weit verbreitete Computerprogrammiersprache mit den Vorteilen plattformübergreifender, hoher Effizienz und Flexibilität. In der C-Sprache müssen wir häufig den größten gemeinsamen Teiler finden. Daher ist es sehr praktisch, eine Funktion zu entwerfen, die die C-Sprache verwendet, um den größten gemeinsamen Teiler zu finden. In diesem Artikel wird detailliert beschrieben, wie eine Funktion geschrieben wird, die den größten gemeinsamen Teiler in der C-Sprache findet, und es werden spezifische Codebeispiele gegeben. Zuerst müssen wir verstehen, was der größte gemeinsame Teiler bedeutet. Der größte gemeinsame Teiler, auch größter gemeinsamer Faktor genannt, bezieht sich auf den größten gemeinsamen Teiler von zwei oder mehr ganzen Zahlen.

See all articles