es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Estoy utilizando el operador módulo, pero aún me da un número negativo.

Estoy tratando de resolver un problema de programación en c++ (versión: (MinGW.org GCC Build-2) 9.2.0)
Estoy utilizando el operador módulo para obtener una respuesta en el rango int, pero para 6, me está dando una respuesta negativa. ¿Por qué está sucediendo esto?
Mi código:


#include <cmath> #include <iostream> using namespace std; int balancedBTs(int h) { if (h <= 1) return 1; int x = balancedBTs(h - 1); int y = balancedBTs(h - 2); int mod = (int)(pow(10, 9) + 7); int temp1 = (int)(((long)(x) * x) % mod); int temp2 = (int)((2 * (long)(x) * y) % mod); int ans = (temp1 + temp2) % mod; return ans; } int main() { int h; cin >> h; cout << balancedBTs(h) << endl; return 0; }

salida:
enter image description here

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema de obtener una respuesta negativa para el operador módulo en C++ se debe al hecho de que el operador módulo devuelve el residuo de una operación de división.

    En el código dado, el resultado de pow(10, 9) + 7 se está convirtiendo a un entero, lo que esencialmente pierde la precisión del valor. En el caso de la entrada 6, el resultado del cálculo supera el valor máximo que se puede almacenar en un entero y, por lo tanto, la operación de módulo resulta en un valor negativo. Para solucionar este problema, utiliza el tipo de dato long long para mod en lugar de int.

    Aquí está el código modificado:

    “`c++
    #include
    #include

    using namespace std;

    int balancedBTs(int h) {
    if (h <= 1) return 1;

    int x = balancedBTs(h - 1);
    int y = balancedBTs(h - 2);
    long long mod = (long long)(pow(10, 9) + 7);
    
    long long temp1 = ((long long)(x) * x) % mod;
    long long temp2 = (2 * (long long)(x) * y) % mod;
    
    long long ans = (temp1 + temp2) % mod;
    
    return ans;
    

    }
    int main()
    {
    int h;
    cin >> h;
    cout << balancedBTs(h) << endl;
    return 0;
    }
    “`

    Esto debería solucionar el problema de obtener valores negativos con el operador módulo.

Comments are closed.