1. 概要

この短いチュートリアルでは、自己同形数について説明し、Javaプログラムとともにそれらを見つけるためのいくつかの方法を学びます。

2. 自己同形数とは何ですか?

自己同形数は、正方形の最後の桁が数自体と同じである数です。

たとえば、25の2乗は625であり、25で終わるため、25は自己同形数です。 同様に、76の2乗は5776であり、これも76で終わるため、76は自己同形数です。

数学では、自己同形数は循環数とも呼ばれます。

自己同形数のその他の例としては、0、1、5、6、25、76、376、625、9376などがあります。

0と1は、すべての基数の自己同形数であるため、自明な自己同形数と呼ばれます。

3. 数が自己同形であるかどうかを判断する

数が自己同形であるかどうかを判断するために利用できる多くのアルゴリズムがあります。 次に、いくつかのアプローチを見ていきます。

3.1. 数字をループして比較する

数値が自己同形であるかどうかを判断する1つの方法は次のとおりです。

  1. 数を取得し、その正方形を計算します
  2. 正方形の最後の桁を取得し、それを数字の最後の桁と比較します
    • 最後の桁が等しくない場合、その数は自己同形数ではありません
    • 最後の桁が等しい場合は、次の手順に進みます
  3. 数字と正方形の両方の最後の桁を削除します
  4. 番号のすべての桁が比較されるまで、手順2と3を繰り返します。

上記のアプローチは、逆の方法で入力番号の桁をループします。

このアプローチを実装するためのJavaプログラムを書いてみましょう。 isAutomorphicUsingLoop()メソッドは、入力として整数を受け取り、それが自己同形であるかどうかをチェックします。

public boolean isAutomorphicUsingLoop(int number) {
    int square = number * number;

    while (number > 0) {
        if (number % 10 != square % 10) {
            return false;
        }
        number /= 10;
        square /= 10;
    }
    
    return true;
}

ここでは、最初にの2乗を計算します。 次に、 number の桁を繰り返し処理し、最後の桁をsquareの桁と1つずつ比較します。

どの段階でも、最後の桁が等しくない場合は、 false を返し、メソッドを終了します。 それ以外の場合は、等しい最後の桁を取り除き、numberの残りの桁に対してプロセスを繰り返します。

これをテストしてみましょう:

assertTrue(AutomorphicNumber.isAutomorphicUsingLoop(76));
assertFalse(AutomorphicNumber.isAutomorphicUsingLoop(9));

3.2. 数字を直接比較する

また、より簡単な方法で、数値が自己同形であるかどうかを判断することもできます。

  1. 数値を取得し、桁数をカウントします( n
  2. 数の二乗を計算する
  3. 正方形から最後のn桁を取得します
    • 正方形の最後のn桁が元の数になる場合、その数は自己同形数です。
    • それ以外の場合は自己同形数ではありません

この場合、数字の桁をループする必要はありません。 代わりに、プログラミングフレームワークの既存のライブラリを使用できます。

Math クラスを使用して、指定された数値の桁を数えたり、その正方形から最後の桁を取得したりするなどの数値演算を実行できます。

public boolean isAutomorphicUsingMath(int number) {
    int square = number * number;

    int numberOfDigits = (int) Math.floor(Math.log10(number) + 1);
    int lastDigits = (int) (square % (Math.pow(10, numberOfDigits)));

    return number == lastDigits;
}

最初のアプローチと同様に、の2乗を計算することから始めます。 次に、numbersquareの最後の桁を1つずつ比較する代わりに、numberの合計numberOfDigitsを一度に取得します。 Math.floor()を使用します。 その後、 Math.pow()を使用して、squareからできるだけ多くの桁を抽出します。 最後に、入力された番号と抽出された番号lastDigitsを比較します。

numberlastDigitsが等しい場合、その数は自己同形であり、 trueを返します。それ以外の場合は、falseを返します。

これをテストしてみましょう:

assertTrue(AutomorphicNumber.isAutomorphicUsingMath(76));
assertFalse(AutomorphicNumber.isAutomorphicUsingMath(9));

4. 結論

この記事では、自己同形数について調べました。 また、対応するJavaプログラムとともに、数値が自己同形数であるかどうかを判断するためのいくつかの方法についても検討しました。

いつものように、これらの例のコードはGitHubから入手できます。