Lỗi thời gian chạy trên các trường hợp kiểm tra số lượng lớn hơn

lập trình


Đây là mã hoàn chỉnh của tôi

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

Những gì tôi đã thử:

Nếu tôi kiểm tra trên 5 trường hợp kiểm thử thì không sao, khi tôi kiểm tra trên 1000 trường hợp kiểm thử thì nó báo “Mã thoát là 3, lỗi thời gian chạy”. Tại sao nó lại nói như vậy? Lý do đằng sau nó là gì? Làm thế nào tôi có thể khắc phục vấn đề này?

Giải pháp 1

Biên dịch không có nghĩa là mã của bạn đúng! :cười:
Hãy nghĩ về quá trình phát triển như viết một email: biên dịch thành công có nghĩa là bạn đã viết email bằng ngôn ngữ phù hợp – ví dụ như tiếng Anh, thay vì tiếng Đức – không phải email đó có chứa thông điệp bạn muốn gửi hay không.

Vì vậy, bây giờ bạn bước vào giai đoạn phát triển thứ hai (trên thực tế là giai đoạn thứ tư hoặc thứ năm, nhưng bạn sẽ đến các giai đoạn sớm hơn sau): Kiểm tra và gỡ lỗi.

Bắt đầu bằng cách xem nó làm gì và nó khác với những gì bạn muốn như thế nào. Điều này rất quan trọng vì nó cung cấp cho bạn thông tin về lý do tại sao nó lại làm như vậy. Ví dụ: nếu một chương trình nhằm mục đích cho phép người dùng nhập một số và nhân đôi số đó và in ra câu trả lời, thì nếu đầu vào/đầu ra sẽ như thế này:

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

Sau đó, khá rõ ràng rằng vấn đề nằm ở bit nhân đôi nó – nó không cộng chính nó với chính nó hoặc nhân nó với 2, nó nhân nó với chính nó và trả về bình phương của đầu vào.
Vì vậy, bạn có thể xem mã và rõ ràng là nó ở đâu đó ở đây:

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

Khi bạn đã biết điều gì có thể xảy ra, hãy bắt đầu sử dụng trình gỡ lỗi để tìm hiểu lý do. Đặt điểm dừng trên dòng đầu tiên của phương thức và chạy ứng dụng của bạn. Khi đạt đến điểm ngắt, trình gỡ lỗi sẽ dừng và trao quyền kiểm soát cho bạn. Giờ đây, bạn có thể chạy mã theo từng dòng một (được gọi là “một bước”) và xem xét (hoặc thậm chí thay đổi) nội dung biến nếu cần (bạn thậm chí có thể thay đổi mã và thử lại nếu cần).
Hãy suy nghĩ xem mỗi dòng trong mã sẽ làm gì trước khi bạn thực thi nó và so sánh điều đó với những gì nó thực sự làm khi bạn sử dụng nút “Bước qua” để thực hiện lần lượt từng dòng. Nó có làm được điều bạn mong đợi không? Nếu vậy, hãy chuyển sang dòng tiếp theo.
Nếu không, tai sao không? Nó khác nhau như thế nào?
Hy vọng rằng điều đó sẽ giúp bạn xác định phần nào của mã đó có vấn đề và vấn đề là gì.
Đây là một kỹ năng và là một kỹ năng rất đáng để phát triển vì nó giúp ích cho bạn trong thế giới thực cũng như trong quá trình phát triển. Và giống như tất cả các kỹ năng, nó chỉ được cải thiện khi sử dụng!

Giải pháp 2

Một số điều cần kiểm tra:
1) điều gì xảy ra nếu không có ‘0’ trong chuỗi đầu vào?
2) điều gì sẽ xảy ra nếu chuỗi bạn truyền tới stoi() lớn hơn INT_MAX?

コメント

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