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

【C++入門】カプレカー数かどうかを判定するプログラムの書き方

このチュートリアルでは、与えられた整数がカプレカー数(Kaprekar Number)であるかどうかを判定するプログラムをC++で作成します。

カプレカー数とは?

カプレカー数とは、次のような性質を持つ特別な自然数です。

  1. ある数 n を2乗する。
  2. その2乗の値を右側から桁を分けて2つの部分に分割する。
  3. 分割した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乗した値を適切な位置で分割し、その合計と元の数を比較する」というシンプルな考え方です。数学的な性質を活かしたアルゴリズムの練習として、ぜひさまざまな数で試してみてください。

このチュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。

  1. 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 など 問題を理解するための具

  2. C++で五胞体数(ペンタトープ数)を求める方法

    五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の