Trong bài toán này, chúng ta được cho một số n. Nhiệm vụ là in ra số lớn nhất nhỏ hơn n sao cho tất cả các chữ số của nó đều khác nhau.
Ví dụ để hiểu vấn đề:
Đầu vào: n = 2332 → Đầu ra: 2319
Để giải quyết, ta đếm ngược từ n xuống 0. Kiểm tra từng số xem có chữ số khác nhau không. Nếu thỏa mãn thì in ra và dừng. Vòng lặp chạy tối đa n lần.
Ví Dụ
Chương trình triển khai giải pháp:
#include <bits/stdc++.h>
using namespace std;
int findDistinctDigitNumber(int n) {
for (int i = n - 1; i >= 0; i--) {
int count[10] = { 0 };
int x = i;
int count1 = 0, count2 = 0;
while (x) {
count[x % 10]++;
x /= 10;
count1++;
}
for (int j = 0; j < 10; j++) {
if (count[j] == 1)
count2++;
}
if (count1 == count2)
return i;
}
return -1;
}
int main() {
int n = 44324;
cout << "Số nhỏ hơn " << n << " với tất cả chữ số khác nhau: " << findDistinctDigitNumber(n);
return 0;
}
Đầu Ra
Số nhỏ hơn 44324 với tất cả chữ số khác nhau là: 43987