Table des matières
Énoncé du problème
Exemples de nombres dégoûtants
Instructions
Solution
Approche Naive
pseudocode
Exemple : programme C++
Sortie
Analyse du temps et de l'espace
Méthode algorithmique de Brian Kernighan
Exemple
Analyse espace-temps
Comparez les méthodes ci-dessus
Conclusion
Maison développement back-end C++ Des chiffres abominables

Des chiffres abominables

Aug 31, 2023 pm 07:41 PM
编程 数字 Abominable

Des chiffres abominables

Un nombre est considéré comme impair s'il contient un nombre impair de un dans son expansion binaire. Les 10 premiers nombres impairs sont 1,2,4,7,10,11,13,14,16,19,21. Fait intéressant, toutes les puissances de 2 sont des nombres impairs car elles n’ont qu’un seul bit défini.

L'article suivant aborde en détail deux méthodes permettant de déterminer si un numéro est un numéro haineux.

Énoncé du problème

Le but de cette question est de vérifier si le nombre donné est un nombre odieux, c'est-à-dire s'il s'agit d'un nombre positif avec un nombre impair de bits définis dans son expansion binaire.

Exemples de nombres dégoûtants

Input: 34
Copier après la connexion
Output: Non-Odious Number
Copier après la connexion
Copier après la connexion

Instructions

La représentation binaire de 34 est 10010.

Définissez le nombre de chiffres = 2.

Puisque le nombre de 1 est un nombre pair, 34 n'est pas un nombre terrible.

Input: 1024
Copier après la connexion
Output: Odious Number
Copier après la connexion

Instructions

La représentation binaire de 1024 est 10000000000.

Définissez le nombre de chiffres = 1.

Puisque 1024 est une puissance de 2, il n'y a qu'un seul bit de réglage. C'est donc un chiffre effrayant.

Input: 53
Copier après la connexion
Output: Non-Odious Number
Copier après la connexion
Copier après la connexion

Instructions

(53)10 = (110101)2

Définissez le nombre de chiffres = 4.

Ce n’est donc pas un nombre abominable.

Solution

Afin de déterminer si un nombre est haineux, il faut savoir si le nombre de chiffres fixé est un nombre impair ou pair. La tâche principale ici est de compter le nombre de chiffres définis dans le développement binaire d'un nombre. La technique suivante peut être utilisée pour compter le nombre de chiffres, puis vérifier si le résultat est pair ou impair.

La traduction chinoise de

Approche Naive

est :

Approche Naive

  • Utilisez les opérateurs de boucle et de décalage vers la droite pour parcourir tous les chiffres du nombre un par un.

  • Si la valeur du bit est 1, augmentez le nombre de un.

  • Vérifiez si la valeur finale du nombre est impaire ou paire.

  • Afficher les réponses.

pseudocode

Fonction no_of_set_bits()

  • Nombre d'initialisations = 0

  • quand (n > 0)

if ((n & 1) > 0)
   Increment count
Right Shift n
Copier après la connexion
  • Nombre de retours

Fonction is_odious()

  • Si (le nombre est un nombre impair)

    • retour vrai

  • Autres

    • erreur de retour

Fonction principale()

  • Initialiser n

  • Appel de fonction no_of_set_bits()

  • Fonction d'appel is_odious()

  • Impression

Exemple : programme C++

Ce programme vérifie si un numéro est offensant ou non. Il vérifie le bit le plus à droite à chaque itération de la boucle en décalant la valeur vers la droite de n à la fin de chaque itération dans la fonction no_of_set_bits().

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

Sortie

27 is Non-Odious Number
Copier après la connexion
Copier après la connexion

Analyse du temps et de l'espace

Complexité temporelle : O(log(n)), puisque l'expansion binaire de n nécessite log2n bits, nous vérifions tous les bits pour vérifier lesquels sont définis.

Complexité spatiale : O(1), car aucun espace supplémentaire n'est utilisé.

Méthode algorithmique de Brian Kernighan

Cet algorithme peut être utilisé pour calculer un nombre défini de chiffres dans un nombre de manière plus efficace. La fonction is_odious() peut alors être utilisée pour déterminer si le nombre est offensant.

Le principe de base de cette méthode est d'effacer à plusieurs reprises le bit le plus à droite du nombre tout en gardant une trace du nombre d'itérations nécessaires pour atteindre zéro. Les étapes impliquées sont -

  • Initialiser le compte à 0

  • Lorsque le nombre est supérieur à zéro, effectuez une opération au niveau du bit et entre le nombre et son complément à 2 pour désactiver le bit défini le plus à droite.

  • Le décompte est incrémenté à chaque itération de boucle.

  • Vérifiez si le décompte final est impair.

  • Afficher les résultats.

Exemple

Soit le nombre 10. Le développement binaire de 10 est 1010. On constate qu'il dispose de 2 bits de réglage.

Itération de boucle 1 -

n = 10
n & (n-1) =  10 & 9
1010   (n)
1001   (n - 1)
1000   (n = 8)
Copier après la connexion

Itération de boucle 2 -

n = 8
n & (n-1) = 8 & 7
1000    (n)
0111	(n-1)
0       (n = 0) 
Copier après la connexion

Nombre d'itérations = nombre de réglages = 2.

pseudocode

Fonction no_of_set_bits()

  • Nombre d'initialisations = 0

  • quand (n > 0)

    • n = n & (n-1)

      Augmenter le nombre

  • Nombre de retours

Fonction is_odious()

    Identique à la méthode précédente

Fonction principale()

    Identique à la méthode précédente

Exemple : programme C++

Ce programme calcule le nombre de bits définis en comptant le nombre d'itérations nécessaires pour désactiver tous les bits définis. Pour annuler des bits, nous effectuons une opération ET au niveau du bit sur n et n-1. En effet, la représentation binaire de n-1 inverse le bit défini le plus à droite de n et tous les bits qui le suivent.

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

Sortie

27 is Non-Odious Number
Copier après la connexion
Copier après la connexion

Analyse espace-temps

Complexité temporelle - O(log(x)), où x est le nombre de chiffres définis dans le nombre. S'il n'y a qu'un seul bit défini, la boucle s'exécutera une fois.

Complexité de l'espace - O(1) puisqu'aucun espace supplémentaire n'est utilisé.

Comparez les méthodes ci-dessus

Bien que la première méthode soit assez facile à comprendre, elle nécessite des itérations log(n) pour produire le résultat final. La deuxième méthode, quant à elle, utilise l'itération log(x), où x est le nombre de chiffres défini dans le développement binaire du nombre. Cela améliore donc les performances.

Conclusion

Cet article aborde deux façons de vérifier si un numéro est dégoûtant. Il nous fournit également le concept de la méthode, des exemples, les algorithmes utilisés, les solutions du programme C++ et l'analyse de la complexité de chaque méthode. Il a également comparé les deux méthodes pour déterminer laquelle était la plus efficace.

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)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 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)

A quoi sert la programmation et à quoi sert de l'apprendre ? A quoi sert la programmation et à quoi sert de l'apprendre ? Apr 28, 2024 pm 01:34 PM

1. La programmation peut être utilisée pour développer divers logiciels et applications, notamment des sites Web, des applications mobiles, des jeux et des outils d'analyse de données. Ses domaines d'application sont très larges, couvrant presque tous les secteurs, notamment la recherche scientifique, la santé, la finance, l'éducation, le divertissement, etc. 2. L'apprentissage de la programmation peut nous aider à améliorer nos compétences en résolution de problèmes et nos capacités de réflexion logique. Lors de la programmation, nous devons analyser et comprendre les problèmes, trouver des solutions et les traduire en code. Cette façon de penser peut cultiver nos capacités analytiques et abstraites et améliorer notre capacité à résoudre des problèmes pratiques.

La clé du codage : libérer la puissance de Python pour les débutants La clé du codage : libérer la puissance de Python pour les débutants Oct 11, 2024 pm 12:17 PM

Python est un langage d'introduction à la programmation idéal pour les débutants grâce à sa facilité d'apprentissage et ses fonctionnalités puissantes. Ses bases incluent : Variables : utilisées pour stocker des données (nombres, chaînes, listes, etc.). Type de données : Définit le type de données dans la variable (entier, virgule flottante, etc.). Opérateurs : utilisés pour les opérations mathématiques et les comparaisons. Flux de contrôle : contrôlez le flux d'exécution du code (instructions conditionnelles, boucles).

Realme GT Neo6 devrait sortir le 9 mai ! La première conférence humaine numérique sur l'IA dans l'industrie informatique Realme GT Neo6 devrait sortir le 9 mai ! La première conférence humaine numérique sur l'IA dans l'industrie informatique May 08, 2024 pm 12:49 PM

Le 7 mai, notre fabricant de téléphones mobiles a officiellement annoncé que la conférence de lancement du GTNeo6 de notre société était prévue pour le 9 mai. GTNoe6 se positionne comme une « tempête de performances », visant à bouleverser la situation des machines de milieu de gamme. En outre, cette conférence sera également la première conférence humaine numérique sur l'IA dans l'industrie de la téléphonie mobile. À ce moment-là, le vice-président de Realme, le président du marketing mondial et le président chinois Xu Qi apparaîtront à la conférence de presse sous la forme d'un humain numérique. L'homme numérique Xu Qi Selon l'introduction officielle, Realme GTNoe6, nom de code "Hurricane", est plus rapide et plus puissant et défiera le produit phare Snapdragon 8 de troisième génération le plus puissant et le produit le plus puissant de sa catégorie. Récemment, le Realme GTNeo6 s'est avéré directement sur la plate-forme de commerce électronique. Certaines configurations de base ont été exposées, montrant que la machine est non seulement équipée d'un processeur Snapdragon 8s, mais prend également en charge une charge flash de 120 W.

Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Oct 11, 2024 pm 08:58 PM

Python permet aux débutants de résoudre des problèmes. Sa syntaxe conviviale, sa bibliothèque complète et ses fonctionnalités telles que les variables, les instructions conditionnelles et les boucles permettent un développement de code efficace. De la gestion des données au contrôle du flux du programme et à l'exécution de tâches répétitives, Python fournit

Collection d'énigmes de programmation C++ : stimule la réflexion et améliore les compétences en programmation Collection d'énigmes de programmation C++ : stimule la réflexion et améliore les compétences en programmation Jun 01, 2024 pm 10:26 PM

Les énigmes de programmation C++ couvrent les concepts d'algorithme et de structure de données tels que la séquence de Fibonacci, la factorielle, la distance de Hamming, les valeurs maximales et minimales des tableaux, etc. En résolvant ces énigmes, vous pouvez consolider vos connaissances en C++ et améliorer la compréhension des algorithmes et vos compétences en programmation.

Démystifier C : un chemin clair et simple pour les nouveaux programmeurs Démystifier C : un chemin clair et simple pour les nouveaux programmeurs Oct 11, 2024 pm 10:47 PM

C est un choix idéal pour les débutants qui souhaitent apprendre la programmation système. Il contient les composants suivants : fichiers d'en-tête, fonctions et fonctions principales. Un simple programme C capable d'imprimer "HelloWorld" a besoin d'un fichier d'en-tête contenant la déclaration de fonction d'entrée/sortie standard et utilise la fonction printf dans la fonction principale pour imprimer. Les programmes C peuvent être compilés et exécutés à l'aide du compilateur GCC. Après avoir maîtrisé les bases, vous pouvez passer à des sujets tels que les types de données, les fonctions, les tableaux et la gestion des fichiers pour devenir un programmeur C compétent.

Quelles sont les plates-formes de trading de monnaie virtuelle dans le monde entier? Quelles sont les plates-formes de trading de monnaie virtuelle dans le monde entier? Feb 27, 2025 pm 06:09 PM

Les quatre principales plateformes mondiales de trading de devises virtuelles en 2025 sont: Binance: un leader dans l'industrie, offrant des options de négociation diversifiées et des produits innovants. OKX: une énorme base d'utilisateurs, fournissant des services complets de crypto-monnaie. Gate.io: convivial, offrant une large gamme d'options de crypto-monnaie. Bitget: Focus sur le trading des dérivés et fournit des contrats à terme à fort effet de levier.

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles