Giả sử chúng ta có một số nhị phân, đó là đại diện của một số n. Chúng ta phải tìm biểu diễn nhị phân của một số nhỏ nhất nhưng lớn hơn n, và nó cũng có cùng số 0 và 1. Vì vậy, nếu số là 1011 (11 ở dạng thập phân), thì kết quả đầu ra sẽ là 1101 (13). Vấn đề này có thể được tìm thấy bằng cách sử dụng phép tính hoán vị tiếp theo. Hãy để chúng tôi xem thuật toán để có được ý tưởng.
Thuật toán
nextBin (bin) -
Begin len := length of the bin for i in range len-2, down to 1, do if bin[i] is 0 and bin[i+1] = 1, then exchange the bin[i] and bin[i+1] break end if done if i = 0, then there is no change, return otherwise j:= i + 2, k := len – 1 while j < k, do if bin[j] is 1 and bin[k] is 0, then exchange bin[j] and bin[k] increase j and k by 1 else if bin[i] is 0, then break else increase j by 1 end if done return bin End
Ví dụ
#include <iostream> using namespace std; string nextBinary(string bin) { int len = bin.size(); int i; for (int i=len-2; i>=1; i--) { if (bin[i] == '0' && bin[i+1] == '1') { char ch = bin[i]; bin[i] = bin[i+1]; bin[i+1] = ch; break; } } if (i == 0) "No greater number is present"; int j = i+2, k = len-1; while (j < k) { if (bin[j] == '1' && bin[k] == '0') { char ch = bin[j]; bin[j] = bin[k]; bin[k] = ch; j++; k--; } else if (bin[i] == '0') break; else j++; } return bin; } int main() { string bin = "1011"; cout << "Binary value of next greater number = " << nextBinary(bin); }
Đầu ra
Binary value of next greater number = 1101