Je connais l'opérateur module (%) qui calcule le reste 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 restes. Je suis sûr que l’opérateur de 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 m'est difficile de voir un problème et de réaliser "Hé! Le reste de la division fonctionnerait ici!".
Imaginez que vous ayez 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 qu'il a fait? À la dernière étape, il est revenu à zéro. Cela pourrait être utilisé dans des situations telles que:
Pour vérifier si N est divisible par M (par exemple, pair ou impair) Ou N est un multiple de M.
Pour mettre un cap d'une valeur particulière. Dans ce cas 3.
Je l'utilise pour les barres de progression et autres qui indiquent la progression dans une grande boucle. La progression n'est signalée que toutes les n fois dans la boucle ou lorsque% n == 0.
Je l'ai utilisé pour restreindre un nombre à un certain multiple:
temp = x - (x % 10); //Restrict x to being a multiple of 10
Etc.
Conversion de la structure de données linéaire en structure de matrice: Où a
est l'index des données linéaires et b
est le nombre d'éléments par ligne:
row = a/b
column = a mod b
La note ci-dessus est une logique simplifiée: a
doit être décalé -1 avant la division et le résultat doit être normalisé +1.
Exemple: (3 rangées 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
Autre utilisation courante du module: hachage d'un nombre par place. Supposons que vous vouliez stocker l'année et le mois dans un nombre à six chiffres 195810. month = 195810 mod 100
tous les 3ème chiffres de droite sont divisibles par 100, le reste est donc les 2 derniers chiffres à droite dans ce cas, le mois est 10. Pour extraire l'année 195810 / 100
donne 1958.
Exemple. Vous avez un message de X octets, mais dans votre protocole la taille maximale est Y et Y <X. Essayez d'écrire une petite application qui divise le message en paquets et vous rencontrerez le mod :)
Chaque fois que vous avez une division et que vous souhaitez exprimer le reste autrement qu'en décimal, l'opérateur mod est approprié. Les choses qui vous viennent à l’esprit sont généralement celles qui vous intéressent. Énumérer combien d'articles vous pouvez mettre dans des seaux et dire "5 restants", c'est bien.
De plus, si vous vous retrouvez dans une situation où vous risquez de commettre des erreurs d'arrondi, la division modulo est une bonne chose. Si vous divisez assez souvent par 3, par exemple, vous ne voulez pas faire passer .33333 comme le reste. Passer le reste et le diviseur (c’est-à-dire la fraction) est approprié.
Un cas d'utilisation que j'ai vu récemment concernait le moment où il fallait inverser un nombre. Donc, 123456
devient 654321
par exemple.
int number = 123456;
int reversed = 0;
while ( number > 0 ) {
# The modulus here retrieves 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;
}
Comme @jweyrich dit, encapsulant des valeurs. J'ai trouvé le mod très pratique lorsque j'ai une liste finie et que je veux y parcourir une boucle - comme une liste fixe de couleurs pour certains éléments de l'interface utilisateur, comme les séries de graphiques, où je souhaite que toutes les séries soient différentes dans la mesure du possible, mais quand je suis à court de couleurs, il suffit de recommencer au début. Cela peut également être utilisé avec, par exemple, des motifs, de sorte que la deuxième fois que le rouge vienne, il est en pointillé; la troisième fois, en pointillés, etc. - mais le mod est juste utilisé pour obtenir le rouge, le vert, le bleu, le rouge, le vert, le bleu, pour toujours.
Calcul des nombres premiers
Le modulo peut être utile pour convertir et scinder le nombre total de minutes en "heures et minutes":
heures = minutes/60
minutes_left = minutes% 60
Dans les heures, nous devons effacer la partie décimale et cela dépendra de la langue que vous utilisez.
Nous pouvons alors réorganiser la sortie en conséquence.
Le module est également très utile si, pour une raison quelconque, vous devez effectuer une division entière et obtenir une décimale, et que vous ne pouvez pas convertir cet entier en un nombre prenant en charge la division décimale, ou si vous devez renvoyer une fraction au lieu d'une décimale. .
Je vais utiliser %
comme opérateur de module
Par exemple
2/4 = 0
où faire cela
2/4 = 0 and 2 % 4 = 2
Vous pouvez donc être vraiment fou et dire que vous voulez permettre à l'utilisateur de saisir un numérateur et un diviseur, puis de leur montrer le résultat sous la forme d'un nombre entier, puis d'un nombre fractionnaire.
whole Number = numerator/divisor
fractionNumerator = numerator % divisor
fractionDenominator = divisor
Un autre cas où la division de module est utile est si vous augmentez ou diminuez un nombre et que vous souhaitez contenir le nombre dans une certaine plage, mais lorsque vous arrivez en haut ou en bas, vous ne voulez pas simplement vous arrêter. Vous souhaitez faire une boucle vers le bas ou le haut de la liste, respectivement.
Imaginez une fonction dans laquelle vous parcourez un tableau.
Function increase Or Decrease(variable As Integer) As Void
n = (n + variable) % (listString.maxIndex + 1)
Print listString[n]
End Function
La raison pour laquelle il s'agit de n = (n + variable)% (listString.maxIndex + 1) est pour permettre la prise en compte de l'index max.
Ce ne sont là que quelques-unes des choses pour lesquelles j'ai dû utiliser le module dans ma programmation d'applications non seulement de bureau, mais aussi dans des environnements de robotique et de simulation.
C'est un moyen facile de savoir si un nombre est pair ou impair. Faites juste # mod 2, si c’est 0 c’est pair, 1 c’est bizarre.
Il existe de nombreux cas où cela est utile.
Si vous avez besoin de limiter un nombre pour qu'il soit dans une certaine plage, vous pouvez utiliser mod. Par exemple, pour générer un nombre aléatoire compris entre 0 et 99, vous pouvez dire:
num = MyRandFunction() % 100;
La meilleure utilisation de l’opérateur de module que j’ai vu est de vérifier si le tableau que nous avons est une version pivotée du tableau original.
A = [1,2,3,4,5,6] B = [5,6,1,2,3,4]
Maintenant, comment vérifier si B est une version tournée de A?
Étape 1: Si la longueur de A n’est pas la même que celle de B, il ne fait aucun doute que ce n’est pas une version tournée.
Étape 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 une variable " Clé "
Étape 3: Maintenant, comment vérifier que si B est une version tournée de A comment ??
C'est ici 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;