Comment dois-je faire le module en C++?
Comment puis-je effectuer un mod opération entre deux entiers en C++?
Est-il un terme pour un poste où googler le titre donne la réponse?
Et.. cliquez ici si vous n'avez pas l'esprit stackoverflow est l'ultime ressource, même pour des questions faciles.
Et.. cliquez ici si vous n'avez pas l'esprit stackoverflow est l'ultime ressource, même pour des questions faciles.
OriginalL'auteur user161190 | 2010-04-05
Vous devez vous connecter pour publier un commentaire.
Comme ceci:
x=y%z
peut-être, peut-être pas. La mise en œuvre définies.
5.6/4: "(a/b)*b + a%b est égal à a", donc aller-vers-zéro (la plus populaire de la mise en œuvre, pour le meilleur ou pour le pire) implique que, et il est mandaté par le C++0x.
Arrondi vers zéro est mandaté par le c++0x, mais pas c++03. Dans les deux normes, votre formule doit être vrai, mais le signe de
a%b
dépend de la façon dont partie intégrante de la division est mise en œuvre. L'enseigne est bien défini comme non-négatif que sia
etb
sont à la fois non-négatif.En tout cas, il ne sera pas carte des entiers négatifs sur un en.wikipedia.org/wiki/Modular_arithmetic l'arithmétique modulaire de l'anneau. Si c'est le cas, vous êtes très chanceux et que votre programme est très portables.
OriginalL'auteur Giffyguy
En c++, et utiliser l'opérateur %
Plus D'Aide
OriginalL'auteur Alex
Que les autres réponses ont indiqué, vous pouvez utiliser le C++ % de l'opérateur. Mais sachez qu'il y a une ride personne n'a encore mentionné: dans l'expression
a % b
, sia
est négatif?Si le résultat de cette opération est positive ou négative? La norme C++ quitte ce jusqu'à la
la mise en œuvre. Donc, si vous voulez gérer les négatifs des entrées de façon portable, vous devriez probablement
faire quelque chose comme
r = abs(a) % b
, puis fixer le signe der
à la hauteur de vos exigences.div
opération d'arrondi vers zéro. Si vous souhaitez aller-vers-négatif-de l'infini, alors vous aurez envier = (unsigned(a) + offset * b) % b
, oùoffset
est assez grand poura + offset * b
de toujours être positif.OriginalL'auteur Jim Lewis
C++ a la
%
de l'opérateur, de temps en temps et faussement nommé "le module" opérateur. En particulier, la STL a lamodulus<>
foncteur dans la<functional>
en-tête. Ce n'est pas la mathématique opérateur de modulo, vous l'esprit, parce que dans le module arithmétiquea mod b
, par définition, est évaluée à une valeur non-négative pour toute valeur dea
et toute valeur positive deb
. En C++, le signe du résultat dea % b
est de mise en œuvre définies par si l'un des arguments est négatif. Ainsi, nous serions plus adéquatement au nom de la%
opérateur de la reste opérateur.Cela dit, si vous voulez vraiment les mathématiques module opérateur, alors vous pouvez définir une fonction pour faire ça:
Tant que
b
est une valeur positive un appel à la fonction ci-dessus donnera un non-résultat négatif.OriginalL'auteur wilhelmtell
En utilisant le module
%
opérateur :a
etb
sont des entiers... alors pourquoidouble
?modulus_a_b
doivent être du même type quea
etb
.eh bien,
a % b
sera soitint
, ou autre chose du même type que au moins l'un desa
etb
. Si vous avez un peu de choix pour le type demodulus_a_b
, selon le contexte 🙂Mais un seul de ces choix est le type que la
%
opérateur retourne. Tous les autres impliquent un transtypage, er,static_cast<>
.double
est certainement l'un de ceux-ci. Aussi, à l'aide dedouble
signifie l'utilisation de la plus lente de maths disponibles (sauf si il y a unlong double
type, chien interdit)...Woups, fixe, j'ai utilisé trop de
double
récemment...La raison je l'ai dit beaucoup de choix c'est parce que par exemple le résultat de
short % short
est unint
, pas unshort
, mais en fonction du contexte, il a probablement fait plus de sens pour l'utiliser comme unshort
. Il y a donc un conflit entre le "du même type que a et b" vs "éviter une conversion implicite".OriginalL'auteur Klaim
si vous utilisez la variable de type double, vous devez utiliser;
OriginalL'auteur ErdeNese