C++でクリシュナムルティ数かどうかを判定する方法
クリシュナムルティ数とは
クリシュナムルティ数(Krishnamurty Number)とは、各桁の数字の階乗の合計が元の数そのものと等しくなる特別な数のことです。例えば、145という数値を見てみましょう。1! + 4! + 5! = 1 + 24 + 120 = 145 となり、各桁の階乗の合計が元の数と一致します。したがって、145はクリシュナムルティ数です。
この性質を持つ数は非常に珍しく、代表的な例としては 1、2、145、40585 などが挙げられます。
判定アルゴリズムの考え方
判定ロジックはシンプルで、以下の手順で処理を行います。
- 対象の数値から一桁ずつ数字を取り出す
- 取り出した数字それぞれの階乗を計算し、合計に加算していく
- すべての桁の処理が終わったら、合計が元の数値と一致しているかどうかを確認する
それでは、実際のコードを見ながら理解を深めましょう。
C++での実装例
#include <iostream>
#include <cmath>
using namespace std;
// 階乗を再帰的に計算する関数
long factorial(int n) {
if(n <= 1){
return 1;
}
return n * factorial(n - 1);
}
// クリシュナムルティ数かどうかを判定する関数
bool isKrishnamurty(int number) {
int temp = number;
int sum = 0;
while(number > 0){
sum += factorial(number % 10); // 各桁の階乗を加算
number /= 10; // 次の桁へ移動
}
if(sum == temp){
return true;
}
return false;
}
int main() {
int n = 145;
if(isKrishnamurty(n)){
cout << n << " is Krishnamurty Number";
} else {
cout << n << " is not Krishnamurty Number";
}
}
コードの解説
- factorial関数: 再帰呼び出しを利用して引数 n の階乗を計算します。n が 1 以下になった時点で 1 を返すことで再帰を終了します。
- isKrishnamurty関数:
number % 10で最下位の桁を取り出し、その階乗を合計に加算します。その後number /= 10で桁を一つずらし、全桁を処理するまで繰り返します。 - 判定部分: 計算した合計 sum が元の数値 temp と一致すれば true を返し、クリシュナムルティ数であると判定します。
実行結果
145 is Krishnamurty Number
このように、各桁の階乗の合計を求めて元の数と比較するだけで、簡単にクリシュナムルティ数を判定できます。計算量は桁数に依存するため、大きな数でも高速に処理できるのが特徴です。
-
C++で巨大な数値が2・3・5で割り切れるかを判定する方法
本記事では、非常に大きな数値が2・3・5のすべてで割り切れるかどうかを判定する方法を解説します。対象となる数は桁数が非常に大きいため、通常の整数型では扱えません。そこで、数値を文字列(string)として受け取り、各桁を調べることで判定を行います。判定の考え方:最小公倍数を使うある数が2・3・5のすべてで割り切れるということは、その数がこれらの最小公倍数(LCM)で割り切れることと同じです。2、3、5の最小公倍数は 30つまり「30で割り切れるか」を判定すればよいさらに、30で割り切れる条件は次のように分解できます。10で割り切れる → 最後の桁(1の位)が「0」である3で割り切れる → 全桁
-
C++で大きな数が11で割り切れるかどうかを判定する方法
本記事では、C++を用いて、ある数が11で割り切れるかどうかを判定する方法を解説します。ここで扱うのは非常に大きな数であるため、int 型や long long 型といった標準的な整数型には収まりません。そこで、数値を文字列として受け取り、桁ごとに処理を行います。 11の倍数判定法とは ある整数が11で割り切れるかどうかは、次の有名な判定法で簡単に確認できます。 左から順に各桁を見て、奇数番目の桁の合計と偶数番目の桁の合計をそれぞれ求める。 両者の差が0、または11の倍数であれば、その数は11で割り切れる。 特に、奇数番目の桁の合計と偶数番目の桁の合計が一致していれば、差は必ず0になるた