Error de tiempo de ejecución en casos de prueba con un número mayor

programación


Aquí está mi código completo.

C++
<pre>#include <iostream>
#include <string>
using namespace std;

int main() {
    int T;
    cin >> T;
    while(T--)
    {
        string str;
        cin >> str;
        int index=-1;
        for(int i=1;i<str.size();++i)
        {
            if(str[i]!='0')
            {
                index=i+1;
                break;
            }
        }
        string a=str.substr(0,index-1);
        string b=str.substr(index-1);
        int str_a=stoi(a);
        int str_b=stoi(b);
        if(str_b>str_a)
        {
            cout << str_a << " " << str_b << endl;
        }
        else
        {
            cout << "-1" << endl;
        }
    }

    return 0;
}

Lo que he probado:

Si pruebo en 5 casos de prueba, entonces está bien, cuando pruebo en 1000 casos de prueba, dice “El código de salida es 3, error de tiempo de ejecución”. ¿Por qué dice así? ¿Cuál es la razón detrás de esto? ¿Cómo puedo solucionar este problema?

Solución 1

¡Compilar no significa que tu código sea correcto! :reír:
Piense en el proceso de desarrollo como escribir un correo electrónico: compilar correctamente significa que escribió el correo electrónico en el idioma correcto (inglés, en lugar de alemán, por ejemplo), no que el correo electrónico contenía el mensaje que deseaba enviar.

Ahora ingresa a la segunda etapa de desarrollo (en realidad es la cuarta o quinta, pero llegará a las etapas anteriores más adelante): Prueba y depuración.

Empiece por observar lo que hace y en qué se diferencia de lo que quería. Esto es importante porque le brinda información de por qué lo está haciendo. Por ejemplo, si un programa está destinado a permitir al usuario ingresar un número y lo duplica e imprime la respuesta, entonces si la entrada/salida fue así:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

Entonces es bastante obvio que el problema está en el bit que lo duplica: no se suma a sí mismo ni lo multiplica por 2, sino que lo multiplica por sí mismo y devuelve el cuadrado de la entrada.
Con eso, puedes mirar el código y es obvio que está en algún lugar aquí:

C#
private int Double(int value)
   {
   return value * value;
   }

Una vez que tenga una idea de lo que podría estar fallando, comience a utilizar el depurador para descubrir el motivo. Coloque un punto de interrupción en la primera línea del método y ejecute su aplicación. Cuando llegue al punto de interrupción, el depurador se detendrá y le entregará el control. Ahora puede ejecutar su código línea por línea (llamado “paso único”) y ver (o incluso cambiar) el contenido de las variables según sea necesario (diablos, incluso puede cambiar el código e intentarlo nuevamente si es necesario).
Piensa en lo que debería hacer cada línea del código antes de ejecutarla y compáralo con lo que realmente hizo cuando usas el botón “Pasar por encima” para ejecutar cada línea por turno. ¿Hizo lo que esperabas? Si es así, pase a la siguiente línea.
¿Si no, porque no? ¿En qué se diferencia?
Con suerte, eso debería ayudarle a localizar qué parte de ese código tiene un problema y cuál es el problema.
Esta es una habilidad que vale la pena desarrollar, ya que le ayuda tanto en el mundo real como en el desarrollo. Y como todas las habilidades, ¡solo mejora con el uso!

Solución 2

Algunas cosas para comprobar:
1) ¿Qué sucede si no hay ‘0’ en la cadena de entrada?
2) ¿Qué sucede si la cadena que le pasas a stoi() es mayor que INT_MAX?

コメント

タイトルとURLをコピーしました