Cho hai số start, end làm biến khoảng và số nguyên q. Mục tiêu: tìm các số trong khoảng sao cho số đó và tích của nó với q không có chữ số chung.
Ví dụ: số 5, q = 3 → tích 15. Cả 5 và 15 có chữ số 5 chung.
Số 2, q = 5 → tích 10. 2 và 10 không có chữ số chung.
Hiểu qua ví dụ
Đầu vào: start = 5, end = 10, q = 2
Đầu ra: Số lượng số thỏa mãn: 5
Giải thích: Các số: 5(10), 6(12), 7(14), 8(16), 9(18).
Đầu vào: start = 20, end = 25, q = 5
Đầu ra: Số lượng số thỏa mãn: 2
Giải thích: 22(110), 23(115).
Phương pháp sử dụng
Duyệt từ start đến end, chuyển số và tích với q thành chuỗi. Tạo mảng arr[26] lưu tần suất ký tự số hiện tại. Duyệt chuỗi tích, nếu ký tự nào có tần suất > 0 trong arr[] thì chung → trả về 0. Ngược lại trả về 1.
- Nhập biến khoảng và
q. - Hàm
check(int i, int q)trả về 1 nếu chữ số không chung. - Chuyển
ithành chuỗistr, tíchi*qthànhstr_2. - Mảng
arr[26] = {0}đếm tần suấtstr. - Duyệt
str_2, nếuarr[str_2[j]-'0'] > 0trả về 0. - Trả về 1.
- Hàm
unequal(int start, int end, int q)trả về đếm. - Khởi tạo
count = 0, duyệti = start..end, nếucheck(i, q)tăngcount. - Trả về
count.
Ví dụ mã nguồn
#include <bits/stdc++.h>
using namespace std;
int check(int i, int q) {
string str = to_string(i);
int length = str.size();
int arr[26] = {0};
int temp = i * q;
string str_2 = to_string(temp);
int length_2 = str_2.size();
for (int j = 0; j < length; j++) {
arr[str[j] - '0']++;
}
for (int j = 0; j < length_2; j++) {
if (arr[str_2[j] - '0']) return 0;
}
return 1;
}
int unequal(int start, int end, int q) {
int count = 0;
for (int i = start; i <= end; i++) {
if (check(i, q)) count++;
}
return count;
}
int main() {
int start = 20, end = 40, q = 4;
cout << "Count of numbers in range such that digits in it and it's product with q are unequal are: " << unequal(start, end, q);
return 0;
}
Chạy mã trên cho kết quả:
Kết quả
Count of numbers in range such that digits in it and it's product with q are unequal are: 1