Comment exécuter une opération MOD entre deux entiers en C ++? P>
6 Réponses :
Utilisation du module % code> Opérateur:
A code> et
B code> sont des entiers ... alors pourquoi
double code>?
MODULUS_A_B CODE> doit être le même type que
A code> et
B code>.
@Mike: Eh bien, A% B code> sera soit
int code>, ou bien le même type que au moins l'un de
A code> et
b code>. Vous avez donc quelques choix pour le type de
modulus_a_b code>, selon le contexte :-)
@Steve: Mais un seul de ces choix est le type que l'opérateur % code> est renvoyé. Tous les autres impliquent un typecast, ER,
static_cast <> code>.
double code> est certainement l'un des derniers. En outre, en utilisant
double code>, en utilisant les mathématiques les plus lentes disponibles (sauf s'il y a un
double double code> type, chien interdit) ...
La raison pour laquelle j'ai dit beaucoup de choix est due par exemple le résultat de court% courte code> est un
int code>, pas un
court code>, mais en fonction de Contexte Il est probablement plus logique de l'utiliser comme un
court code>. Il y a donc un conflit entre «le même type que A et B» vs «évitant une conversion implicite».
Comme ça: x = y% z p>
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 i> C ++ 03. Dans les deux normes, votre formule doit être vraie, mais le signe de A% B code> 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 code> et
B code> 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 code> est non négatif et
B code> est positif i>: p
En tout cas, il ne créera pas d'entiers négatifs sur un en.wikipedia.org/wiki/modular_arithmetic A> Bague arithmétique modulaire. Si c'est le cas, vous avez beaucoup de chance et votre programme est très défavorable.
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 code>, que si
a code> 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 code>, puis fixez le signe de
r code> pour correspondre à vos besoins. P>
Cela suppose que vous voulez que l'opération implicite div code> soit ronde à zéro. Si vous voulez aller-retourner-infinité, alors vous voulez
r = (non signé (a) + offset * b)% b code>, où
décalage code> est assez grand Pour
A + offset * b code> Pour toujours être positif.
C ++ a l'opérateur qui dit, si vous voulez vraiment l'opérateur de modulus mathématique, vous pouvez définir une fonction à faire Juste que: p> tant que % code>, occasionnellement et inhabituellement nommé "L'opérateur de modulus". En particulier, la STL a le modulus
modulus <> code> dans le
a mod b code> par définition évalue à une valeur non négative pour toute valeur de
A code> et toute valeur positive de
B code>. En C ++, le signe du résultat de
A% B code> est défini par la mise en œuvre em> si l'un des arguments est négatif. Donc, nous nommerions plus de manière appropriée le
%% code> l'opérateur reste em>.
B code> est une valeur positive qu'un appel à la fonction ci-dessus produira un résultat non négatif. P > p>
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.
Si vous utilisez une double variable, vous devez utiliser;
double x; double y; double result = fmod(x, y);
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.