Módulo para números negativos en C++
- Resto frente a módulo
-
el operador
%
en C++ -
Implementación de
%
en C++ -
el operador
%
en Python -
Implementación de
%
en Python - Métodos para lograr el módulo equivalente de Python en C++
En este tutorial, descubriremos las diferencias entre resto y módulo. Aprenderemos sobre los fundamentos del operador %
.
Más adelante, aprenderemos cómo se comporta el operador %
en Python y C++. Finalmente, resumiremos este artículo discutiendo algunas formas de implementar la funcionalidad del módulo en C++.
Resto frente a módulo
El comportamiento exacto del signo %
puede variar según los diferentes lenguajes de programación. El operador frecuentemente produce resultados sorprendentes que nos dejan confundidos.
¿Crea un módulo o un resto? Antes de examinar su comportamiento en los lenguajes de programación, primero aclaremos en qué se diferencian.
Resto
El resto es simplemente la parte que queda después de la división aritmética de dos números enteros. Ya sea positivo o negativo, el signo del resto siempre está determinado por el signo del dividendo.
Verifique los ejemplos a continuación para entender esto claramente.
Ejemplos:
-
7 % 3 = 1
Aquí el dividendo es 7, que tiene signo positivo, por lo que el resultado también tendrá signo positivo.
-
-7 % 3 = -1
Aquí el dividendo es -7, que tiene signo negativo, por lo que el resultado también tendrá signo negativo.
-
7 % -3 = 1
Aquí el dividendo es 7, que tiene signo positivo, por lo que el resultado también tendrá signo positivo.
-
-7 % -3 = -1
Aquí el dividendo es -7, que tiene signo negativo, por lo que el resultado también tendrá signo negativo.
Módulo
El módulo es la suma del resto y el divisor cuando tienen signos opuestos, y la parte restante después de la división aritmética, cuando el resto y el divisor tienen el mismo signo.
El módulo tendrá el mismo signo que el divisor. Verifique los ejemplos a continuación para entender esto claramente.
Ejemplos:
-
5 % 3 = 2
Aquí, tanto el divisor como el resto tienen signo positivo, por lo que el resto también tendrá signo positivo.
-
-5 % 3 = 1
Aquí, el divisor y el resto son de signo opuesto, por lo que el resultado será la suma del resto y el divisor. es decir, -2 + 3 = 1
-
5 % -3 = -1
Aquí tanto el divisor como el resto son signos opuestos. El resultado será la suma del resto y el divisor. es decir, 2 + -3 = -1
-
-5 % -3 = -2
Aquí, tanto el divisor como el resto son del mismo signo, por lo que el resultado será el mismo que el resto.
Está claro a partir de los ejemplos anteriores que el módulo y el resto son iguales si tanto el dividendo como el divisor son positivos. Ambos son diferentes en el caso de números negativos.
En este punto, esperamos que quede claro en qué se diferencian el resto y el módulo. Ahora hablemos del comportamiento del operador %
en Python y C++.
el operador %
en C++
En C++, el %
se conoce como operador módulo. Es un operador aritmético.
Se utiliza para calcular el resto que resulta de realizar la división de enteros. Aunque tiene el nombre de “módulo”, lo importante a recordar es que no proporciona el módulo.
En C++, el símbolo %
solo devuelve el resto. Compruebe el ejemplo a continuación.
#include <iostream>
using namespace std;
int main() {
cout << -7 % 3 << endl;
cout << 7 % -3 << endl;
}
Producción :
-1
1
Como sugiere el resultado, el operador %
no nos da el módulo. Solo está devolviendo un resto.
Implementación de %
en C++
Veamos la implementación de %
en C++. El resto en C++ se devuelve según la siguiente ecuación.
resto = a - ( b * trunc ( a / b ) )
Desarrollemos nuestra lógica para calcular el resto usando la ecuación anterior sin el operador %
.
#include <iostream>
using namespace std;
int calRemainder(int a, int b) {
int q = a / b;
return a - (b * q);
}
int main() {
int a = -7, b = 3;
cout << calRemainder(a, b) << endl;
}
Producción :
-1
el operador %
en Python
En Python, el %
se conoce como el operador de módulo. El operador módulo se considera una operación aritmética en Python.
Se utiliza para calcular el módulo
que resulta de realizar la división de enteros. Aquí es donde Python difiere de C++.
Cuando usamos el operador de módulo en C++, devuelve el resto, mientras que Python devuelve el módulo. Consulte los ejemplos a continuación para observar el comportamiento del operador de módulo en Python.
print(-7 % 3)
print(7 % -3)
Producción :
2
-2
En el primer ejemplo, -7 % 3
nos da el resto -1. Como el resto (-1) y el divisor (3) son de signos opuestos, su suma nos dará el módulo. es decir, -1 + 3 = 2
.
Lo mismo es cierto para el ejemplo 2.
Implementación de %
en Python
Veamos la implementación de %
en Python. El módulo en Python se devuelve de acuerdo con la siguiente ecuación.
módulo = a - ( b * suelo( a / b ) )
Desarrollemos nuestra lógica para calcular el módulo utilizando la ecuación anterior sin el operador %
.
from math import floor
def calModulus(a, b):
q = floor(a / b)
return a - b * q
print(calModulus(-7, 3))
Producción :
2
Métodos para lograr el módulo equivalente de Python en C++
Hemos examinado cómo difieren el resto y el módulo y cómo se comporta el operador %
en Python y C++. En Python, siempre obtendrá valores no negativos cuando use %
con un divisor positivo.
La mayoría de las veces, trabajamos con divisores positivos y necesitamos la funcionalidad del módulo y no solo el resto. Módulo siempre devuelve valores positivos si el divisor tiene signo positivo.
Veamos diferentes técnicas para lograr este comportamiento en C++.
Método 1: implementar una ecuación
Podemos lograr el comportamiento del módulo de Python implementando la ecuación módulo = a - (b * piso (a / b))
en C++.
#include <math.h>
#include <iostream>
using namespace std;
int getModulus(int dividend, int divisor) {
// Type casting is necessary as (int)/(int) will give int result, i.e. -5 / 2
// will give -1 and not -2.5
int t = (int)floor((double)dividend / divisor);
return dividend - divisor * t;
}
int main() { cout << getModulus(-8, 3); }
Producción :
1
Método 2: suma el resto y el divisor
Otra forma de lograr la funcionalidad del módulo en C++ es sumando el resto y el divisor si tienen signos opuestos.
Suponemos que nuestro divisor tiene un signo positivo, por lo que cada vez que obtenemos un resto negativo, lo sumamos al divisor para obtener el valor del módulo.
#include <iostream>
using namespace std;
int getModulus(int dividend, int divisor) {
int t = dividend % divisor;
return t >= 0 ? t : t + divisor;
}
int main() { cout << getModulus(-7, 3); }
Producción :
2