不含连续 1 的二进制字符串计数


在这个问题中,我们必须找到一些没有连续 1 的二进制数。在 3 位二进制字符串中,有三个二进制数 011、110、111 具有连续的 1,并且有五个数字没有连续的 1。因此,将此算法应用于 3 位数字后,答案将为 5。

如果 a[i] 是位数为 I 且不包含任何连续 1 的二进制数的集合,而 b[i] 是位数为 I 且包含连续 1 的二进制数的集合,则存在如下递归关系

a[i] := a[i - 1] + b[i - 1]
b[i] := a[i - 1]

输入和输出

Input:
This algorithm takes number of bits for a binary number. Let the input is 4.
Output:
It returns the number of binary strings which have no consecutive 1’s.
Here the result is: 8. (There are 8 binary strings which has no consecutive 1’s)

算法

countBinNums(n)

输入:n 是位数。
输出 - 统计没有连续 1 的数字有多少个。

Begin
   define lists with strings ending with 0 and ending with 1
   endWithZero[0] := 1
   endWithOne[0] := 1

   for i := 1 to n-1, do
      endWithZero[i] := endWithZero[i-1] + endWithOne[i-1]
      endWithOne[i] := endWithZero[i-1]
   done
   return endWithZero[n-1] + endWithOne[n-1]
End

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

示例

#include <iostream>
using namespace std;

int countBinNums(int n) {
   int endWithZero[n], endWithOne[n];
   endWithZero[0] = endWithOne[0] = 1;

   for (int i = 1; i < n; i++) {
      endWithZero[i] = endWithZero[i-1] + endWithOne[i-1];
      endWithOne[i] = endWithZero[i-1];
   }
   return endWithZero[n-1] + endWithOne[n-1];
}

int main() {
   int n;
   cout << "Enter number of bits: "; cin >> n;
   cout << "Number of binary numbers without consecitive 1's: "<<countBinNums(n) << endl;
   return 0;
}

输出

Enter number of bits: 4
Number of binary numbers without consecitive 1's: 8

更新于: 2020-06-16

647 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告