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

C++で数値を最小個数の疑似2進数の合計として表現する方法

疑似2進数とは

疑似2進数(pseudo-binary number)とは、0と1という2進数の数字のみで構成される数値のことです。例として、00、11、10、100、111、1011などが挙げられます。

このチュートリアルでは、ある数値Nをできるだけ少ない個数の疑似2進数の合計として表現する方法を解説します。

以下に、数値を疑似2進数の合計として表した具体例を示します。

入力 : 23
出力 : 11 + 11 + 1
説明 : 23 = 11 + 11 + 1、つまり疑似2進数(11、11、1)の合計は23になります。

入力 : 50
出力 : 10 + 10 + 10 + 10 + 10

解法のアプローチ

Nを表現するための最小個数の疑似2進数を見つけるための、効果的なアプローチを以下に示します。

  • 数値Xを作成し、Nの各桁の値に応じてXの対応する桁を1または0に更新します。

  • Nの各桁を確認します。

    • その桁が0の場合、Xの対応する桁を0にします。

    • 0以外の場合、Xの対応する桁を1にします。

    • 例えば、N = 32 の場合、X = 11 となります。

  • こうして得られたXは、1つの疑似2進数です。

  • NからXを減算し、Nが0になるまで手順1を繰り返します。

C++による実装例

上記アプローチのC++コード

#include<iostream>
using namespace std;
int main(){
    int N = 51;
    // Nが0になるまで疑似2進数を求め続けます。
    cout << "pseudo-binary representation of " << N << " is: ";
    while (N > 0){
        // Nの各桁に応じて0と1で構成されるXを求めます。
        int temp = N;
        int X = 0, bit = 1;
        // tempの各桁がゼロかどうかを確認します。
        while (temp!=0){
            int last_dig = temp % 10;
            temp = temp / 10;
            if (last_dig != 0)
                X += bit;
            bit *= 10;
        }
        // 疑似2進数を1つ出力します。
        cout << X << " ";
        // NからXを引いて更新します。
        N = N - X;
    }
    return 0;
}

実行結果

pseudo-binary representation of 51 is: 11 10 10 10 10

コードの解説

  • 外側のwhileループでは、Nを受け取り、各桁の数字を取り出してXを求めます。

  • 変数tempにNの値をコピーし、内側のループでtempの各桁を確認しながら、変数Xの対応する桁を更新していきます。

  • Xの値を出力します。これが1つの疑似2進数に相当します。

  • NからXを減算して更新し、Nが0になるまで外側のループを繰り返します。

まとめ

このチュートリアルでは、数値を最小個数の疑似2進数の合計として表現する方法について解説しました。すべての疑似2進数を効率的に見つけるアプローチと、そのC++実装コードを紹介しました。なお、ここで紹介したロジックは、C、Java、Pythonなど他のプログラミング言語でも同様に実装できます。本チュートリアルが皆さんのお役に立てば幸いです。

  1. C++でデューデニー数(Dudeney Number)を判定する方法

    デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ

  2. C++で数値が2つの三角数の和として表現できるか判定する方法

    本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ