【C++】Deserium数とは?判定方法をサンプルコード付きで解説
はじめに
このチュートリアルでは、「Deserium数」について、具体的な例を交えながら解説します。
各桁の数字を、その桁の位置に応じた指数で累乗した値の合計が、元の数と一致する数のことをDeserium数と呼びます。ここでいう指数は、左端の桁を1乗とし、右に進むごとに1ずつ大きくしていきます(右端の桁は「桁数」乗になります)。
例として「135」を考えてみましょう。
11 + 32 + 53 = 1 + 9 + 125 = 135
累乗の合計が元の数と一致するため、135はDeserium数です。同じように、89(81 + 92 = 8 + 81 = 89)もDeserium数に該当します。
Deserium数の判定手順
ある数がDeserium数かどうかを調べるには、次の手順で処理を進めます。
- 判定対象の数を用意する。
- その数の桁数を求める。
- 累乗の合計を格納する変数を初期化する。
- 数が0になるまで、以下の処理を繰り返す。
- 10で割った余りから、最下位の桁を取り出す。
- pow(桁, 桁数) を合計に加算し、そのあとで桁数を1減らす。
- 最終的な合計が元の数と一致していればDeserium数、一致しなければDeserium数ではないと判定する。
C++での実装例
それでは、実際のC++コードを見ていきましょう。
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
// 桁数を求める関数
int getDigitsCount(int n) {
int digitsCount = 0;
do {
digitsCount++;
n = n / 10;
} while (n != 0);
return digitsCount;
}
// Deserium数かどうかを判定する関数
bool isDeseriumNumber(int n) {
int originalNumber = n;
int digitsCount = getDigitsCount(n);
int sum = 0;
while (n != 0) {
int digit = n % 10;
sum += pow(digit, digitsCount);
digitsCount--;
n = n / 10;
}
return sum == originalNumber;
}
int main() {
int n = 135;
// int n = 123; // 判定する数を変更する場合はここを編集
if (isDeseriumNumber(n)) {
cout << "Yes";
}
else {
cout << "No";
}
cout << endl;
return 0;
}実行結果
上記のコードをコンパイルして実行すると、次の出力が得られます。
Yes
135は 11 + 32 + 53 = 135 と計算できるため、「Yes」と表示されます。なお、判定する数をコメントアウトされている 123 に変更して実行すると、「No」と表示されます。
コードの解説
- getDigitsCount関数:do-whileループで数を10で割り続け、その回数から桁数を求めます。nが0のときも1桁として正しく扱えるよう、do-whileが採用されています。
- isDeseriumNumber関数:はじめに元の数を保存しておき、下の桁から順に「その桁の値の累乗」を合計へ加算していきます。1桁処理するたびに指数を1減らすことで、左端の桁が1乗、右端の桁が桁数乗に対応します。
- main関数:判定したい数を用意し、結果がtrueなら「Yes」、falseなら「No」を出力します。
補足として、pow関数はdouble型を返すため、非常に大きな数を扱う場合や厳密な整数判定が必要なケースでは、自前の整数演算で累乗を計算する実装に置き換えるとより安全です。
まとめ
このチュートリアルでは、Deserium数の定義と、C++での判定プログラムの実装方法を学びました。本チュートリアルについて質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++で数値の累乗を計算する方法:再帰・非再帰プログラムの実装例
数の累乗とは数の累乗は x^y の形式で表され、x は基数(底)、y は指数を表します。例を見てみましょう。x = 2、y = 10 の場合 x^y = 1024 ここで、x^y は 2^10 を意味します数の累乗は、再帰的プログラムと非再帰的プログラムの2つの方法で計算できます。以下、それぞれの実装方法を詳しく解説します。非再帰プログラムによる累乗の計算まずは、forループを使用した非再帰的なプログラムの例です。サンプルコード#include<iostream>using namespace std;int power(int x, int y) { int i
-
数値を逆順に並べ替えるC++プログラムの書き方と解説
数値の反転とは、その桁の数字を逆の順序に並べ替えて格納することを指します。 例えば、元の数値が6529である場合、出力として9256が表示されます。 以下に、数値を反転させるC++プログラムの例を示します。 サンプルプログラム #include <iostream> using namespace std; int main() { int num = 63972, rev = 0; while(num > 0) { rev = rev*10 + num%10; num = num/10; } cout<