C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で数値を「A」と「B」の文字列として辞書式順序に出力する方法

この問題では、数値 N が与えられ、それを「A」と「B」のみで構成される文字列として辞書式順序(lexicographic order)で出力するプログラムを作成します。

「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個(N=2まで)、長さ2の文字列は4個(N=6まで)、長さ3の文字列は8個(N=14まで)存在するというものです。

長さが判明したら、次に文字列の各文字を決定していきます。基準値 num = 2^(残りの長さ) と現在の番号 stringNumber を比較し、num の方が小さければ現在の文字は「B」となり、stringNumber から num を差し引いて更新します。そうでなければ「A」を出力します。各反復処理のたびに残りの長さを1減らし、これを繰り返すことで目的の文字列が完成します。

動作の解説(N = 47 の場合)

findStringLength(47) により文字列の長さは5と求まります。続いて stringNumber = 47 − (2^5 − 2) = 17 となります。最初の比較では num = 16 < 17 であるため「B」を出力し、stringNumber は1に更新されます。以降の反復では num = 8, 4, 2, 1 のいずれも stringNumber = 1 を下回らないため「A」が出力され、最終的に「BAAAA」が得られます。

ソリューションの動作を示すプログラム

#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<<"辞書式順序で「A」と「B」の文字列として表した数値は ";
    printNumString(N);
    return 0;
}

出力

辞書式順序で「A」と「B」の文字列として表した数値は BAAAA
  1. C++でstd::stringとint(整数)を連結する方法【stringstream・std::to_string】

    C++では、文字列(std::string)と整数型(int)のデータをそのまま連結することはできません。連結を行うには、まず整数を文字列に変換する必要があります。本記事では、stringstreamを使った変換方法を中心に、具体的な手順とサンプルコードをわかりやすく解説します。例えば、文字列「str」と数値「10」を連結すると、結果として「str10」という一つの文字列が得られます。入力:文字列 str と 数値 10 出力:連結された文字列 str10処理の流れ(アルゴリズム)ステップ1:文字列と数値を受け取る ステップ2:数値を文字列に変換する ステップ3:両者を連結する ステップ4:終

  2. C++で文字列を数値に、またはその逆に変換する方法を解説

    はじめに この記事では、C++における「文字列から数値への変換」と「数値から文字列への変換」という2つの処理方法を解説します。まずは文字列から数値への変換から見ていきましょう。 文字列から数値への変換 ここでは、数値を表す文字列を整数型のデータに変換する方法を紹介します。この問題は、atoi() 関数を使うことで簡単に解決できます。この関数は文字列を引数として受け取り、それを整数型のデータに変換して返します。 atoi() 関数は <cstdlib> ヘッダに含まれています。 入力: 数値文字列 1234 出力: 1234 アルゴリズム ステップ1: 数値文字列を用意する ステップ