【C++入門】カプレカー数かどうかを判定するプログラムの書き方
このチュートリアルでは、与えられた整数がカプレカー数(Kaprekar Number)であるかどうかを判定するプログラムをC++で作成します。
カプレカー数とは?
カプレカー数とは、次のような性質を持つ特別な自然数です。
- ある数 n を2乗する。
- その2乗の値を右側から桁を分けて2つの部分に分割する。
- 分割した2つの数の合計が、元の数 n と一致すれば、その数はカプレカー数である。
例えば、45はカプレカー数です。45の2乗は2025であり、これを「20」と「25」に分割すると、20 + 25 = 45となり元の数に戻るからです。他にも、9(81 → 8 + 1 = 9)、297(88209 → 88 + 209 = 297)などがカプレカー数として知られています。また、慣例的に1もカプレカー数として扱われます。
判定アルゴリズムの手順
カプレカー数を判定するための手順は以下の通りです。
- 判定対象の数 n を初期化する。
- n の2乗を求める。
- 2乗した値の桁数を数え、変数に保存する。
- 2乗した値を10、100、1000…と桁数分だけ分割し、それぞれの分割パターンについて左右の部分の合計を計算する。
- いずれかの分割で合計が n と一致すれば true を返し、どれも一致しなければ false を返す。
なお、分割によって右側の部分が0になるケース(例:10の2乗「100」を「10」と「0」に分ける場合など)は除外する必要があるため、実装時には注意しましょう。
C++での実装例
それでは、実際のコードを見てみましょう。
#include<bits/stdc++.h>
using namespace std;
bool isKaprekarNumber(int n) {
// 慣例として1はカプレカー数とみなす
if (n == 1) {
return true;
}
int nSquare = n * n, digitsCount = 0;
// 2乗した値の桁数を数える
while (nSquare) {
digitsCount++;
nSquare /= 10;
}
nSquare = n * n;
// 各位置で2乗の値を2つに分割して合計を確認
for (int i = 1; i < digitsCount; i++) {
int parts = pow(10, i);
if (parts == n) {
continue;
}
int sum = nSquare / parts + nSquare % parts;
if (sum == n) {
return true;
}
}
return false;
}
int main() {
int n = 25;
string result = isKaprekarNumber(n) ? "True" : "False";
cout << result << endl;
return 0;
}
コードのポイント
nSquare / partsで左側の部分、nSquare % partsで右側の部分を取り出しています。parts == nの場合は分割しても意味がないためスキップしています。- ループは桁数より1回少なく回すことで、右側が空になる不正な分割を防いでいます。
実行結果
上記のコードを実行すると、次のような結果が出力されます。
False
この例では n = 25 を判定しています。25の2乗は625ですが、「6 + 25 = 31」「62 + 5 = 67」となり、どちらも25と一致しないため False が出力されます。試しに n を45や297に変更すると、True が返されることを確認できます。
まとめ
本記事では、C++を使ってカプレカー数を判定する方法を解説しました。ポイントは「2乗した値を適切な位置で分割し、その合計と元の数を比較する」というシンプルな考え方です。数学的な性質を活かしたアルゴリズムの練習として、ぜひさまざまな数で試してみてください。
このチュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。
-
C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】
この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の