6
votes

Comment puis-je faire du module en C ++?

Comment exécuter une opération MOD entre deux entiers en C ++?


2 commentaires

Y a-t-il un terme pour un poste où googling le titre donne la réponse?


Et .. Cliquez ici si cela ne vous dérange pas que Stackoverflow soit la ressource ultime, même pour des questions faciles.


6 Réponses :


14
votes

en C ++, utilisez% opérateur

Plus d'aide


0 commentaires

1
votes

Utilisation du module % Opérateur: xxx


4 commentaires

A et B sont des entiers ... alors pourquoi double ? MODULUS_A_B doit être le même type que A et B .


@Mike: Eh bien, A% B sera soit int , ou bien le même type que au moins l'un de A et b . Vous avez donc quelques choix pour le type de modulus_a_b , selon le contexte :-)


@Steve: Mais un seul de ces choix est le type que l'opérateur % est renvoyé. Tous les autres impliquent un typecast, ER, static_cast <> . double est certainement l'un des derniers. En outre, en utilisant double , en utilisant les mathématiques les plus lentes disponibles (sauf s'il y a un double double type, chien interdit) ...


La raison pour laquelle j'ai dit beaucoup de choix est due par exemple le résultat de court% courte est un int , pas un court , mais en fonction de Contexte Il est probablement plus logique de l'utiliser comme un court . Il y a donc un conflit entre «le même type que A et B» vs «évitant une conversion implicite».



9
votes

Comme ça: x = y% z


7 commentaires

Sauf que le résultat est négatif pour un dividende négatif.


@Potatocorn peut-être, peut-être pas. C'est défini par la mise en œuvre.


@wilhelmtell: 5.6 / 4: "(A / B) * B + A% B est égal à un", donc rond-aller-zéro (la mise en œuvre écrasante, pour le meilleur ou le pire) implique que, et il est mandaté par C ++ 0x.


Round vers zéro est mandaté par C ++ 0x, mais pas C ++ 03. Dans les deux normes, votre formule doit être vraie, mais le signe de A% B dépend de la manière dont la division intégrale est mise en œuvre. Le signe est bien défini comme non négatif que si A et B sont à la fois non négatifs.


@Potatocorne Mise en œuvre. Défini.


@Dennis Le signe est bien défini comme non négatif que si A est non négatif et B est positif : p


En tout cas, il ne créera pas d'entiers négatifs sur un en.wikipedia.org/wiki/modular_arithmetic Bague arithmétique modulaire. Si c'est le cas, vous avez beaucoup de chance et votre programme est très défavorable.



10
votes

Comme les autres réponses ont indiqué, vous pouvez utiliser l'opérateur C ++%. Mais soyez conscient qu'il y a une ride-nœud que personne n'a jamais mentionné: dans l'expression a% b , que si a est négatif? Si le résultat de cette opération soit positif ou négatif? La norme C ++ laisse cela jusqu'à la la mise en oeuvre. Donc, si vous voulez gérer des entrées négatives de manière portant, vous devriez probablement faire quelque chose comme r = abs (a)% b , puis fixez le signe de r pour correspondre à vos besoins.


1 commentaires

Cela suppose que vous voulez que l'opération implicite div soit ronde à zéro. Si vous voulez aller-retourner-infinité, alors vous voulez r = (non signé (a) + offset * b)% b , où décalage est assez grand Pour A + offset * b Pour toujours être positif.



14
votes

C ++ a l'opérateur % , occasionnellement et inhabituellement nommé "L'opérateur de modulus". En particulier, la STL a le modulus modulus <> dans le en-tête. Ce n'est pas l'opérateur de module mathématique, de l'esprit, car dans le modulus arithmétiques a mod b par définition évalue à une valeur non négative pour toute valeur de A et toute valeur positive de B . En C ++, le signe du résultat de A% B est défini par la mise en œuvre si l'un des arguments est négatif. Donc, nous nommerions plus de manière appropriée le %% l'opérateur reste .

qui dit, si vous voulez vraiment l'opérateur de modulus mathématique, vous pouvez définir une fonction à faire Juste que: xxx

tant que B est une valeur positive qu'un appel à la fonction ci-dessus produira un résultat non négatif.


1 commentaires

Personne d'autre n'indique comment le% est essentiellement un opérateur restant en C ++ et ne fournit pas de mise en oeuvre de module qui enveloppe correctement une valeur d'entrée négative pour a. C'est la meilleure réponse.



1
votes

Si vous utilisez une double variable, vous devez utiliser;

double x;
double y;
double result = fmod(x, y);


0 commentaires