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など他のプログラミング言語でも同様に実装できます。本チュートリアルが皆さんのお役に立てば幸いです。
-
C++でデューデニー数(Dudeney Number)を判定する方法
デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ
-
C++で数値が2つの三角数の和として表現できるか判定する方法
本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ