Erreur d’exécution sur un plus grand nombre de cas de test

la programmation


Voici mon code complet

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;
}

Ce que j’ai essayé :

Si je teste sur 5 cas de test, tout va bien, lorsque je teste sur 1 000 cas de test, il est indiqué “Le code de sortie est 3, erreur d’exécution”. Pourquoi ça dit comme ça ? Quelle est la raison derrière cela ? Comment puis-je résoudre ce problème ?

Solution 1

Compiler ne signifie pas que votre code est correct ! :rire:
Considérez le processus de développement comme la rédaction d’un e-mail : une compilation réussie signifie que vous avez écrit l’e-mail dans la bonne langue – l’anglais plutôt que l’allemand par exemple – et non que l’e-mail contenait le message que vous vouliez envoyer.

Vous entrez maintenant dans la deuxième étape du développement (en réalité, c’est la quatrième ou la cinquième, mais vous reviendrez aux étapes précédentes plus tard) : les tests et le débogage.

Commencez par regarder ce qu’il fait et en quoi cela diffère de ce que vous vouliez. Ceci est important, car cela vous donne des informations sur la raison pour laquelle il le fait. Par exemple, si un programme est destiné à permettre à l’utilisateur de saisir un nombre et qu’il le double et imprime la réponse, alors si l’entrée/sortie était comme ceci :

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

Ensuite, il est assez évident que le problème vient du bit qui le double – il ne s’ajoute pas à lui-même, ni ne le multiplie par 2, il le multiplie par lui-même et renvoie le carré de l’entrée.
Donc avec ça, vous pouvez regarder le code et il est évident qu’il se trouve quelque part ici :

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

Une fois que vous avez une idée de ce qui pourrait ne pas fonctionner, commencez à utiliser le débogueur pour découvrir pourquoi. Placez un point d’arrêt sur la première ligne de la méthode et exécutez votre application. Lorsqu’il atteint le point d’arrêt, le débogueur s’arrêtera et vous confiera le contrôle. Vous pouvez maintenant exécuter votre code ligne par ligne (appelé “single stepping”) et consulter (ou même modifier) ​​le contenu des variables si nécessaire (bon sang, vous pouvez même modifier le code et réessayer si vous en avez besoin).
Pensez à ce que chaque ligne du code doit faire avant de l’exécuter et comparez cela à ce qu’elle a réellement fait lorsque vous utilisez le bouton « Passer par-dessus » pour exécuter chaque ligne tour à tour. Est-ce que ça a fait ce que vous attendiez ? Si c’est le cas, passez à la ligne suivante.
Si non, pourquoi pas ? En quoi est-ce différent ?
Espérons que cela devrait vous aider à localiser quelle partie de ce code présente un problème et quel est le problème.
C’est une compétence qui mérite d’être développée car elle vous aide dans le monde réel ainsi que dans le développement. Et comme toutes les compétences, elle ne s’améliore qu’à l’usage !

Solution 2

Quelques points à vérifier :
1) que se passe-t-il s’il n’y a pas de « 0 » dans la chaîne d’entrée ?
2) que se passe-t-il si la chaîne que vous transmettez à stoi() est plus grande que INT_MAX ?

コメント

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