用C++打印一个数字为字典序排列的'A'和'B'字符串


在这个问题中,我们给定一个数字N。我们的任务是创建一个程序来_打印一个数字为字典序排列的'A'和'B'字符串_。

所有数字用'A'和'B'字符串表示如下:

1 = A
2 = B
3 = AA
4 = AB
5 = BA
6 = BB
7 = AAA
8 = AAB


让我们来看一个例子来理解这个问题:

输入:N = 12

输出:BAB

解决方案

‘A’和‘B’的字符串类似于二进制数。为了找到字符串,我们将首先找到字符串的长度,利用这样一个事实:长度为1的数字有2个(到大小2),长度为2的数字有4个(到大小6),长度为3的数字有8个(到大小14)。找到长度后,我们需要找到字符串的字符。通过迭代更新剩余长度,因为我们向字符串添加数字。字符的决定是基于将N与(2^(剩余长度))进行比较,如果N小于当前字符是'B',否则是'A'。在每次迭代后,我们将长度减1,如果字符是'B',我们将更新N,并将其减去num。

程序说明了我们解决方案的工作原理:

示例

在线演示

#include <iostream>
#include<math.h>
using namespace std;

int findStringLength(int M) {

   int stringLen = 1;
   while((pow(2, stringLen + 1) - 2) < M) {
      stringLen++;
   }
   return stringLen;
}

void printNumString(int N) {
   
   int stringLen, num, stringNumber;
   stringLen = findStringLength(N);
   stringNumber = N - (pow(2, stringLen) - 2);
   while (stringLen) {
      num = pow(2, stringLen - 1);

      if (num < stringNumber) {
         cout<<"B";
         stringNumber -= num; }
      else {
         cout<<"A";
      }
      stringLen--;
   }
}

int main() {
   int N = 47;
   cout<<"The number as sting of 'A' and 'B' in lexicographic order is ";
   printNumString(N);
   return 0;
}

输出

The number as sting of 'A' and 'B' in lexicographic order is BAAAA

更新于:2021年1月27日

86 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告
© . All rights reserved.