Heim >Backend-Entwicklung >C++ >Abscheuliche Zahlen
Eine Zahl gilt als ungerade, wenn sie in ihrer Binärentwicklung eine ungerade Anzahl von Einsen aufweist. Die ersten 10 ungeraden Zahlen sind 1,2,4,7,10,11,13,14,16,19,21. Interessanterweise sind alle Zweierpotenzen ungerade Zahlen, da bei ihnen nur 1 Bit gesetzt ist.
Der folgende Artikel bespricht im Detail zwei Methoden, um festzustellen, ob es sich bei einer Zahl um eine hasserfüllte Zahl handelt.
Der Zweck dieser Frage besteht darin, zu überprüfen, ob die gegebene Zahl eine abscheuliche Zahl ist, d. h. eine positive Zahl mit einer ungeraden Anzahl gesetzter Bits in ihrer Binärentwicklung.
Input: 34
Output: Non-Odious Number
Die binäre Darstellung von 34 ist 10010.
Stellen Sie die Anzahl der Ziffern = 2 ein.
Da die Anzahl der Einsen eine gerade Zahl ist, ist 34 keine schlechte Zahl.
Input: 1024
Output: Odious Number
Die binäre Darstellung von 1024 ist 10000000000.
Stellen Sie die Anzahl der Ziffern = 1 ein.
Da 1024 eine Potenz von 2 ist, gibt es nur 1 Einstellungsbit. Es ist also eine beängstigende Zahl.
Input: 53
Output: Non-Odious Number
(53)10 = (110101)2
Anzahl der Ziffern = 4 einstellen.
Es ist also keine abscheuliche Zahl.
Um festzustellen, ob eine Zahl hasserfüllt ist, müssen wir wissen, ob die Anzahl der eingestellten Ziffern eine ungerade oder eine gerade Zahl ist. Die Hauptaufgabe besteht hier darin, die Anzahl der bei der Binärentwicklung einer Zahl gesetzten Stellen zu zählen. Die folgende Technik kann verwendet werden, um die Anzahl der Ziffern zu zählen und dann zu prüfen, ob das Ergebnis ungerade oder gerade ist.
Die chinesische Übersetzung von „Naiver Ansatz“ lautet: „Naiver Ansatz“.Wenn der Bitwert 1 ist, erhöhen Sie die Anzahl um eins.
Überprüfen Sie, ob der Endwert von count ungerade oder gerade ist.
Antworten anzeigen.
Pseudocode
Initialisierungsanzahl = 0
wenn (n > 0)
if ((n & 1) > 0) Increment count Right Shift n
Funktion is_odious()
Wenn (Anzahl eine ungerade Zahl ist)
true zurückgeben
Rückgabefehler
Funktion main()
N initialisieren
Funktionsaufruf no_of_set_bits()
Funktion is_odious() aufrufen
Ausdruck
Beispiel: C++-Programm
#include<iostream> using namespace std; // this function counts the number of set bits by analyzing the rightmost bit using a while loop till n > 0. // it performs logical & operation between 1 and n to determine if the rightmost bit is set or not. // if it is set, count is incremented by 1 // right shift the value of n to make the bit left of the rightmost bit, the new rightmost bit. int no_of_set_bits(int n){ int count = 0; while (n > 0){ // if the rightmost bit is 1: increment count if ((n & 1) > 0){ count++; } // right shift the value of n to examine the next bit n = n >> 1; } return count; } // this function determines if count of set bits is odd or even // odd -> odious bool is_odious(int count){ // if count is odd return true if (count % 2 != 0){ return true; } return false; } // main function int main(){ int n = 27; int countBits = no_of_set_bits(n); if (is_odious(countBits)){ cout << n << " is Odious Number"; } else { cout << n << " is Non-Odious Number"; } return 0; }
27 is Non-Odious Number
Analyse von Zeit und Raum
Zeitkomplexität: O(log(n))Raumkomplexität: O(1), da kein zusätzlicher Raum verwendet wird.
Die algorithmische Methode von Brian Kernighan Dieser Algorithmus kann verwendet werden, um eine bestimmte Anzahl von Ziffern in einer Zahl effizienter zu berechnen. Mit der Funktion is_odious() kann dann ermittelt werden, ob die Nummer anstößig ist.
Anfangszählung auf 0
Wenn die Zahl größer als Null ist, führen Sie ein bitweises & zwischen der Zahl und ihrem Zweierkomplement durch, um das am weitesten rechts gesetzte Bit zu deaktivieren.
Die Anzahl wird bei jeder Schleifeniteration erhöht.
Überprüfen Sie, ob die Endzählung ungerade ist.
Ergebnisse anzeigen.
Beispiel
n = 10 n & (n-1) = 10 & 9 1010 (n) 1001 (n - 1) 1000 (n = 8)
Schleifeniteration 2 -
n = 8 n & (n-1) = 8 & 7 1000 (n) 0111 (n-1) 0 (n = 0)
Anzahl der Iterationen = Anzahl der Einstellungen = 2. Pseudocode
Funktion no_of_set_bits()
Initialisierungsanzahl = 0
wenn (n > 0)
n = n & (n-1)
Funktion is_odious()
Gleiche wie die vorherige Methode
Funktion main()
Gleiche wie die vorherige Methode
Beispiel: C++-Programm
Dieses Programm berechnet die Anzahl der gesetzten Bits, indem es die Anzahl der Iterationen zählt, die erforderlich sind, um alle gesetzten Bits zu löschen. Um Bits zu löschen, führen wir eine bitweise UND-Operation für n und n-1 durch. Dies liegt daran, dass die binäre Darstellung von n-1 das am weitesten rechts gesetzte Bit von n und alle darauf folgenden Bits umdreht.#include<iostream> using namespace std; // this function counts the number of set bits by unsetting the rightmost set bit using a while loop till n > 0. // it performs logical & operation between n and n - 1 to unset the rightmost set bit. // count is incremented in every iteration int no_of_set_bits(int n){ int count = 0; while (n > 0){ // update the value of n to unset the current rightmost set bit n = n & (n - 1); count++; } return count; } // this function determines if count of set bits is odd or even // odd -> odious bool is_odious(int count){ // if count is odd return true if (count % 2 != 0){ return true; } return false; } // main function int main(){ int n = 27; int countBits = no_of_set_bits(n); // function call if (is_odious(countBits)){ cout << n << " is Odious Number"; } else { cout << n << " is Non-Odious Number"; } return 0; }
27 is Non-Odious Number
Raum-Zeit-Analyse
ZeitkomplexitätRaumkomplexität – O(1), da kein zusätzlicher Raum verwendet wird.
Während die erste Methode ziemlich einfach zu verstehen ist, erfordert sie Log(n)-Iterationen, um das Endergebnis zu erzielen. Die zweite Methode hingegen verwendet die Log(x)-Iteration, wobei x die Anzahl der Ziffern ist, die in der binären Erweiterung der Zahl festgelegt werden. Daher verbessert es die Leistung.
In diesem Artikel werden zwei Möglichkeiten besprochen, um zu überprüfen, ob eine Zahl ekelhaft ist. Außerdem erhalten wir das Konzept der Methode, Beispiele, verwendete Algorithmen, C++-Programmlösungen und eine Komplexitätsanalyse jeder Methode. Außerdem wurden die beiden Methoden verglichen, um festzustellen, welche effektiver war.
Das obige ist der detaillierte Inhalt vonAbscheuliche Zahlen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!