Reconnaître quand utiliser l’opérateur de module

Je sais que l’opérateur de module (%) calcule le rest d’une division. Comment puis-je identifier une situation dans laquelle je devrais utiliser l’opérateur de module?

Je sais que je peux utiliser l’opérateur de module pour voir si un nombre est pair ou impair et premier ou composite, mais c’est à peu près tout. Je ne pense pas souvent en termes de rest. Je suis sûr que l’opérateur du module est utile et j’aimerais apprendre à en tirer parti.

J’ai juste des problèmes pour identifier où l’opérateur de module est applicable. Dans diverses situations de programmation, il est difficile pour moi de voir un problème et de réaliser “Hey! Le rest de la division fonctionnerait ici!”.

Imaginez que vous disposiez d’un temps écoulé en secondes et que vous souhaitiez le convertir en heures, minutes et secondes:

h = s / 3600; m = (s / 60) % 60; s = s % 60; 
 0 % 3 = 0; 1 % 3 = 1; 2 % 3 = 2; 3 % 3 = 0; 

Avez-vous vu ce que c’était? À la dernière étape, il est revenu à zéro. Cela pourrait être utilisé dans des situations telles que:

  1. Vérifier si N est divisible par M (par exemple, impair ou pair) ou N est un multiple de M.

  2. Mettre un bouchon d’une valeur particulière. Dans ce cas 3.

  3. Pour obtenir les derniers M chiffres d’un nombre -> N% (10 ^ M).

Je l’utilise pour les barres de progression et similaires qui marquent les progrès dans une grande boucle. La progression n’est signalée que tous les n fois dans la boucle ou lorsque count% n == 0.

Je l’ai utilisé en limitant un nombre à un certain multiple:

 temp = x - (x % 10); //Ressortingct x to being a multiple of 10 
  • Valeurs d’emballage (comme une horloge).
  • Fournir des champs finis aux algorithmes de clés symésortingques.
  • Opérations binarys

Etc.

Exemple. Vous avez un message de X octets, mais dans votre protocole, la taille maximale est Y et Y

Conversion de la structure de données linéaire en structure masortingcielle: où a est l’indice de données linéaires et b est le nombre d’éléments par ligne:

 row = a/b column = a mod b 

Remarque ci-dessus est une logique simplifiée: a doit être décalé -1 avant de diviser et le résultat doit être normalisé +1.

Exemple: (3 lignes de 4)

 1 2 3 4 5 6 7 8 9 10 11 12 (7 - 1)/4 + 1 = 2 7 is in row 2 (7 - 1) mod 4 + 1 = 3 7 is in column 3 

Une autre utilisation courante du module: le hachage d’un nombre par endroit. Supposons que vous vouliez stocker année et mois dans un nombre à six chiffres 195810. month = 195810 mod 100 tous les chiffres à partir de la 3e à droite sont divisibles par 100, donc le rest correspond aux 2 chiffres les plus à droite 195810 / 100 donne 1958.

Calcul des nombres premiers

Chaque fois que vous avez une division et que vous voulez exprimer le rest autrement qu’en décimal, l’opérateur mod est approprié. Les choses qui viennent à l’esprit sont généralement lorsque vous voulez faire quelque chose de lisible par l’homme avec le rest. Il est bon de lister le nombre d’articles que vous pourriez mettre dans des seaux et de dire “5 restants”.

De plus, si vous rencontrez des erreurs d’arrondi, la division modulo est une bonne chose. Si vous divisez par 3 assez souvent, par exemple, vous ne voulez pas laisser passer 33333 pour le rest. Passer le rest et diviseur (c.-à-la fraction) est approprié.

Comme le dit @jweyrich, envelopper les valeurs. J’ai trouvé le mod très pratique quand j’ai une liste finie et que je veux la parcourir en boucle – comme une liste fixe de couleurs pour certains éléments de l’interface utilisateur, comme les séries de graphiques, où toutes les séries doivent être différentes, dans la mesure du possible, mais quand je suis à court de couleurs, juste pour recommencer au début. Cela peut également être utilisé avec, par exemple, des modèles, de sorte que la seconde fois que le rouge arrive, il est en pointillé; la troisième fois, pointillé, etc. – mais le mod est juste utilisé pour obtenir le rouge, le vert, le bleu, le rouge, le vert, le bleu, pour toujours.

Le modulo peut être utile pour convertir et diviser les minutes totales en “heures et minutes”:

heures = minutes / 60

minutes_left = minutes% 60

Dans le bit d’heures, nous devons supprimer la partie décimale et cela dépend de la langue que vous utilisez.

Nous pouvons alors réorganiser la sortie en conséquence.

Un cas d’utilisation que j’ai vu récemment était lorsque vous devez inverser un nombre. Donc, 123456 devient 654321 par exemple.

 int number = 123456; int reversed = 0; while ( number > 0 ) { # The modulus here resortingeves the last digit in the specified number # In the first iteration of this loop it's going to be 6, then 5, ... # We are multiplying reversed by 10 first, to move the number one decimal place to the left. # For example, if we are at the second iteration of this loop, # reversed gonna be 6, so 6 * 10 + 12345 % 10 => 60 + 5 reversed = reversed * 10 + number % 10; number = number / 10; } 

Il y a beaucoup d’exemples où c’est utile.

Si vous devez restreindre un nombre à une certaine plage, vous pouvez utiliser le mod. Par exemple, pour générer un nombre aléatoire compris entre 0 et 99, vous pouvez dire:

 num = MyRandFunction() % 100; 

Modulus est également très utile si, pour une raison quelconque, vous devez faire une division entière et obtenir un nombre décimal, et que vous ne pouvez pas convertir le nombre entier en nombre décimal, ou si vous devez retourner une fraction au lieu d’un nombre décimal. .

Je vais utiliser % comme opérateur de module

Par exemple

2/4 = 0

où faire ça

2/4 = 0 and 2 % 4 = 2

Vous pouvez donc être vraiment fou et dire que vous voulez permettre à l’utilisateur d’entrer un numérateur et un diviseur, puis lui montrer le résultat sous la forme d’un nombre entier, puis un nombre fractionnaire.

 whole Number = numerator/divisor fractionNumerator = numerator % divisor fractionDenominator = divisor 

Un autre cas où la division du module est utile est si vous augmentez ou diminuez un nombre et que vous voulez contenir le nombre dans une certaine plage de nombres, mais lorsque vous arrivez en haut ou en bas, vous ne devez pas vous arrêter. Vous voulez boucler respectivement en bas ou en haut de la liste.

Imaginez une fonction où vous parcourez un tableau.

 Function increase Or Decrease(variable As Integer) As Void n = (n + variable) % (listSsortingng.maxIndex + 1) Print listSsortingng[n] End Function 

La raison pour laquelle il s’agit de n = (n + variable)% (listSsortingng.maxIndex + 1) est de permettre la comptabilisation de l’indice max.

Ce ne sont là que quelques exemples de l’utilisation du module dans la programmation non seulement des applications de bureau, mais aussi de la robotique et des environnements de simulation.

  • Calculer le plus grand commun diviseur
  • Déterminer si un nombre est un palindrome
  • Déterminer si un nombre consiste uniquement en …
  • Déterminer combien … un nombre consiste en …

Mon utilisation préférée est pour l’itération.

Supposons que vous ayez un compteur que vous incrémentez et que vous souhaitiez ensuite saisir dans une liste connue les éléments correspondants, mais vous ne disposez que de n éléments parmi lesquels vous souhaitez répéter un cycle.

var indexFromB = (counter-1)%n+1;

Résultats ( counter=indexFromB ) donné n=3 :

 `1=1` `2=2` `3=3` `4=1` `5=2` `6=3` ... 

C’est un moyen facile de savoir si un nombre est pair ou impair. Il suffit de faire # mod 2, si c’est 0 c’est pair, 1 c’est impair.

La meilleure utilisation de l’opérateur de module pour lequel j’ai vu est de vérifier si le tableau que nous avons est une version pivotée du tableau d’origine.

A = [1,2,3,4,5,6] B = [5,6,1,2,3,4]

Maintenant, comment vérifier si B est une version pivotée de A?

Étape 1: Si la longueur de A n’est pas la même que celle de B, il ne s’agit certainement pas d’une version pivotée.

Etape 2: Vérifiez l’index du premier élément de A dans B. Ici, le premier élément de A est 1. Et son index dans B est 2 (en supposant que votre langage de programmation a un index de base zéro). permet de stocker cet index dans la variable ” Key

Étape 3: Maintenant, comment vérifier si B est une version pivotée de A comment?

C’est là que la fonction de module bascule:

 for (int i = 0; i< A.length; i++) { // here modulus function would check the proper order. Key here is 2 which we recieved from Step 2 int j = [Key+i]%A.length; if (A[i] != B[j]) { return false; } } return true;