给定一个数字n,我们的任务是找到所有1到n个二进制数,且其二进制表示中没有连续的1。
例子:
Input : n = 4
Output : 1 2 4 5 8 9 10
These are numbers with 1 to 4
bits and no consecutive ones in
binary representation.
Input : n = 3
Output : 1 2 4 5
我们将一位一位相加并递归地打印数字。对于最后一点,我们有两个选择。
if last digit in sol is 0 then
we can insert 0 or 1 and recur.
else if last digit is 1 then
we can insert 0 only and recur.
我们将使用递归-
- 我们制作一个解矢量sol,并在其中插入第一个位1,这将是第一个数字。
- 现在我们检查解向量的长度是否小于或等于n。
- 如果是这样,那么我们将计算十进制数字,并将其存储在地图中,因为它按排序顺序存储数字。
- 现在我们有两个条件:
- 如果sol中的最后一位数字为0,我们可以插入0或1并重复出现。
- 否则,如果最后一位是1,那么我们只能插入0并重复出现。
numberWithNoConsecutiveOnes(n, sol)
{
if sol.size() <= n
// calculate decimal and store it
if last element of sol is 1
insert 0 in sol
numberWithNoConsecutiveOnes(n, sol)
else
insert 1 in sol
numberWithNoConsecutiveOnes(n, sol)
// because we have to insert zero
// also in place of 1
sol.pop_back();
insert 0 in sol
numberWithNoConsecutiveOnes(n, sol)
}
// CPP program to find all numbers with no
// consecutive 1s in binary representation.
#include
using namespace std;
map h;
void numberWithNoConsecutiveOnes(int n, vector
sol)
{
// If it is in limit i.e. of n lengths in
// binary
if (sol.size() <= n) {
int ans = 0;
for (int i = 0; i < sol.size(); i++)
ans += pow((double)2, i) *
sol[sol.size() - 1 - i];
h[ans] = 1;
// Last element in binary
int last_element = sol[sol.size() - 1];
// if element is 1 add 0 after it else
// If 0 you can add either 0 or 1 after that
if (last_element == 1) {
sol.push_back(0);
numberWithNoConsecutiveOnes(n, sol);
} else {
sol.push_back(1);
numberWithNoConsecutiveOnes(n, sol);
sol.pop_back();
sol.push_back(0);
numberWithNoConsecutiveOnes(n, sol);
}
}
}
// Driver program
int main()
{
int n = 4;
vector sol;
// Push first number
sol.push_back(1);
// Generate all other numbers
numberWithNoConsecutiveOnes(n, sol);
for (map::iterator i = h.begin();
i != h.end(); i++)
cout << i->first << " ";
return 0;
}
输出:
1 2 4 5 8 9 10
相关文章:
计算不带连续1的二进制字符串的数量