C++でデムロ数(11…1の平方)を生成する方法を解説
デムロ数(Demlo Number)とは
デムロ数とは、11…1 のような形の数(レピュニット)を2乗したときに生成される回文数のことです。ただし、対象となる数は10桁未満である必要があります。
例えば、以下のように美しく対称的な数字の並びが現れます。
- 11 × 11 = 121
- 111 × 111 = 12321
- 1111 × 1111 = 1234321
C++での実装手順
まず、文字列型の変数を宣言します。
string demNum = "1111"; string square = "";
続いて、demNum 文字列の長さ分だけループ処理を行います。ループ内では、インデックス値 i を文字に変換し、square 変数の末尾に追加していきます。
for(int i=1; i<=demNum.length(); i++){
square += char(i + '0');
}次に、2つ目のループで demNum 文字列の長さから逆順に処理を行います。ここでも同様に、インデックス値 i を文字に変換して square に追加します。
for (int i = demNum.length() - 1; i >= 1; i--)
square += char(i + '0');この2つのループにより、「1から n へ増加し、その後 n-1 から1へ減少する」という対称的な数字列が完成します。
サンプルコード
以下の実装例を見ると、デムロ数の仕組みがより理解しやすくなります。
#include <iostream>
using namespace std;
int main(){
string demNum = "1111";
string square = "";
for(int i=1; i<=demNum.length(); i++){
square += char(i + '0');
}
for (int i = demNum.length() - 1; i >= 1; i--)
square += char(i + '0');
cout << square;
return 0;
}出力結果
上記のコードを実行すると、以下の出力が得られます。
1234321
まとめ
デムロ数は一見複雑そうに見えますが、実際には「昇順+降順」という単純な文字列構築だけで生成できることが分かります。この性質を利用すれば、大きな数の乗算を実際に行わなくても、回文数を効率的に求めることが可能です。
-
C++で文字列の部分文字列の総数を求める方法を解説
この記事では、与えられた文字列から作成できる空でない部分文字列の個数を求める方法について解説します。入力 : string = "moon" 出力 : 10 説明 : 部分文字列は m、o、o、n、mo、oo、on、moo、oon、moon の 10 個です。 入力 : string = "yellow" 出力 : 21解法のアプローチ文字列の長さを n とします。上の例からも分かるように、考えられるすべての部分文字列の個数を求めるには、長さ n、(n-1)、(n-2)、(n-3)、……2、1 の部分文字列の個数を順に加算していく必要があります。部分文
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の