Gestion des nombres négatifs dans les calculs modulo en C/C/Obj-C
Dans les langages basés sur C, les opérations modulo utilisant le "% " L'opérateur peut présenter des comportements inattendus lorsqu'il traite des nombres négatifs. Plus précisément, le résultat peut être différent de celui des opérations mathématiques modulo.
Explication du problème
En tant que concept mathématique, la division modulo renvoie le reste lorsqu'un nombre est divisé par un autre. Cependant, dans C/C /Obj-C, l'opérateur modulo privilégie la préservation du signe du dividende (le premier opérande) plutôt que d'assurer un reste positif. Cela peut conduire à des résultats négatifs même lorsque la division mathématique donnerait un reste positif.
Par exemple, considérons l'expression "(-1) % 8". Mathématiquement, cela devrait renvoyer 7 car 8 entre une fois dans -1 avec un reste de 7. Cependant, en C/C , le résultat serait -1 car il conserve le signe du dividende.
Solution avec considérations de mise en œuvre
Pour remédier à cette situation, une version révisée de l'opérateur modulo peut être implémentée pour tenir compte des nombres négatifs :
<code class="c++">int customMod(int a, int b) { if (b < 0) { return -customMod(-a, -b); } int ret = a % b; if (ret < 0) { ret += b; } return ret; }</code>
Dans cette version optimisée, si l'on des opérandes est négatif, il inverse les signes des deux et invoque l'opérateur modulo personnalisé de manière récursive. Après avoir calculé le reste, il vérifie s'il est négatif et ajoute le diviseur pour le rendre positif. Cela garantit que le résultat final conserve le reste mathématique correct. Par exemple, customMod(-1, 8) renverrait 7, tandis que customMod(13, -8) renverrait -3.
Dans l'ensemble, cet opérateur modulo révisé gère efficacement les nombres négatifs et produit des résultats qui correspondent aux mathématiques. attentes modulo.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!