在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”类似于二进制数。要找到字符串,我们首先要找到字符串的长度,这是使用2个长度为1的数字(耕种大小2),4个长度为2的数字(耕种大小6),8个长度为3的数字(耕种大小) 14)。找到长度后,我们需要找到字符串的字符。通过迭代地更新剩余长度,当我们向字符串中添加数字时。如果N小于(2 ^(剩余长度)),则根据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