大量测试用例的运行时错误


这是我的完整代码

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

我尝试过的:

如果我测试 5 个测试用例,那就没问题,当我测试 1000 个测试用例时,它会显示“退出代码为 3,运行时错误”。 为什么这么说呢? 其背后的原因是什么? 我该如何解决这个问题?

解决方案1

编译通过并不意味着你的代码是正确的! :笑:
将开发过程视为编写电子邮件:成功编译意味着您使用正确的语言(例如英语,而不是德语)编写了电子邮件,而不是电子邮件包含您想要发送的消息。

现在您进入了开发的第二阶段(实际上是第四或第五阶段,但稍后您将进入早期阶段):测试和调试。

首先看看它做了什么,以及它与您想要的有何不同。 这很重要,因为它为您提供了有关这样做的原因的信息。 例如,如果一个程序打算让用户输入一个数字,然后将其加倍并打印答案,那么如果输入/输出如下所示:

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

那么很明显,问题在于将其加倍的位 – 它不是将自身与自身相加,或将其乘以 2,而是将其与自身相乘并返回输入的平方。
因此,您可以查看代码,很明显它位于此处:

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

一旦您知道可能出了什么问题,就开始使用调试器来找出原因。 在方法的第一行放置一个断点,然后运行您的应用程序。 当到达断点时,调试器将停止,并将控制权交给您。 现在,您可以逐行运行代码(称为“单步执行”),并根据需要查看(甚至更改)变量内容(哎呀,您甚至可以更改代码,然后根据需要重试)。
在执行代码之前,请考虑代码中的每一行应该执行的操作,并将其与使用“Step over”按钮依次执行每一行时实际执行的操作进行比较。 它达到了你的预期吗? 如果是这样,请转到下一行。
如果没有,为什么不呢? 有什么不同?
希望这可以帮助您找到代码的哪一部分有问题以及问题是什么。
这是一项技能,而且非常值得培养,因为它可以帮助您在现实世界中以及在开发中。 和所有技能一样,它只会通过使用而提高!

解决方案2

需要检查的一些事项:
1)如果输入字符串中没有“0”会发生什么?
2) 如果传递给 stoi() 的字符串大于 INT_MAX 会发生什么?

コメント

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