Đếm palindromes [trùng lặp]

Aug 16 2020

Câu hỏi là: Một cuộc thi kết thúc sau n ngày hh giờ, mm phút và ss giây. Với hai giá trị của n, chúng ta sẽ tìm thấy bao nhiêu palindrom của định dạng nhhmmss trong khoảng thời gian được chỉ định?

ví dụ 1

Đầu vào

1 2

Đầu ra

472

Giải trình

Chúng ta cần kiểm tra các số từ 1000000 đến 2235959 chỉ bao gồm các số có 6 chữ số cuối tương ứng với thời gian. Chúng tôi tìm thấy 472 số như vậy: 1000001, 1001001, 1002001, 1003001, 1004001, ..., 2231322, 2232322, 2233322, 2234322, 2235322

Ví dụ 2

Đầu vào

0 2

Đầu ra

708

Giải trình

Có 708 palindromes: 0000000, 0001000, 0002000, 0003000, 0004000, ..., 2231322, 2232322, 2233322, 2234322, 2235322

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

#include <bits/stdc++.h>

using namespace std;

#define endl "\n"
#define int long long

int ctr = 0;

int isPal(int n) {
    int reverse = 0;

    for(int i = n; i > 0; i /= 10)
        reverse = reverse*10 + i%10;

    return n == reverse; 
}

void inRange(int low, int high) {
     for (int i = low; i <= high; i++) {
          if (isPal(i)) {
             string tmp_str = to_string(i);
             string hh = tmp_str.substr(1, 2);
             string mm = tmp_str.substr(3, 2);
             string ss = tmp_str.substr(5, 2);
             int hh1, mm1, ss1;

             hh1 = stoi(hh);
             mm1 = stoi(mm);
             ss1 = stoi(ss);

             if (hh1 <= 23 && mm1 <=59 && ss1 <=59)
                 ctr++;
          }
     }
}

int main() {
    ios::sync_with_stdio(0); 
    cin.tie(0); 
    cout.tie(0);

    int n1, n2, min, max;

    cin >> n1 >> n2;

    min = n1*1000000;
    max = (n2*1000000)+235959;

    inRange(min,max);

    if (n1 == 0)
       cout << (ctr+99);
    else
        cout << ctr;

    return 0;
}

Nhưng nó đang xuất hiện một lỗi là:

    terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr: __pos (which is 3) > this->size() (whic
h is 1)
exited, aborted

Bất kỳ trợ giúp sẽ được đánh giá cao!

Trả lời

1 Blastfurnace Aug 15 2020 at 23:40

Các std::to_stringchức năng không bao gồm số không hàng đầu trong kết quả. Mã hiện tại của bạn giả sử chuỗi có 7 chữ số nhưng điều đó có thể không đúng và có khả năng std::string::substrlà lý do tại sao ném một ngoại lệ cho một vị trí không hợp lệ.