Giới thiệu
Cho số N (dạng chuỗi). Tìm số nhỏ nhất lớn hơn N sử dụng chính xác các chữ số của N.
Ví dụ minh họa
Đầu vào
N = "92534"
Đầu ra
92543
Phương pháp giải
Thuật toán next permutation:
- Duyệt từ phải sang trái, tìm i sao cho
num[i] > num[i-1]. - Nếu không tìm thấy → không có số lớn hơn.
- Tìm chỉ số
smallesttrong [i, n-1] sao chonum[smallest] > num[i-1]và nhỏ nhất. - Hoán đổi
num[i-1]vànum[smallest]. - Sắp xếp tăng dần phần tử từ i đến cuối.
Chương trình minh họa
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
void findNextGreater(char number[], int n) {
int i, j;
for (i = n-1; i > 0; i--)
if (number[i] > number[i-1]) break;
if (i == 0) {
cout << "Next number is not possible";
return;
}
int x = number[i-1], smallest = i;
for (j = i+1; j < n; j++)
if (number[j] > x && number[j] < number[smallest])
smallest = j;
swap(number[smallest], number[i-1]);
sort(number + i, number + n);
cout << number;
}
int main() {
char number[] = "92534";
int n = strlen(number);
cout << "The next number with same set of digits is ";
findNextGreater(number, n);
return 0;
}
Đầu ra
The next number with same set of digits is 92543