Đếm palindromes [trùng lặp]
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
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ệ.