C++で数値がミステリーナンバーかどうかを判定する方法
ミステリーナンバーとは?
ここでは、ある数値がミステリーナンバー(Mystery Number)であるかどうかを判定する方法を解説します。ミステリーナンバーとは、互いに桁を逆にした(反転させた)2つの数の和として表すことができる数のことです。
例えば、121 は「29 + 92」と表すことができます。29 と 92 は互いに数字を逆順にした関係にあるため、121 はミステリーナンバーだと言えます。
アルゴリズムの考え方
判定を行うには、1 から n/2 までの各数値 i について、その逆順の数 j を求め、「i + j == n」が成り立つかどうかをすべてのペアに対して確認します。条件を満たすペアが1つでも見つかれば、その数はミステリーナンバーであると判断できます。
C++での実装例
#include <bits/stdc++.h>
using namespace std;
// 数値を反転させる関数
int revNum(int str) {
string s = to_string(str);
reverse(s.begin(), s.end());
stringstream ss(s);
int rev = 0;
ss >> rev;
return rev;
}
// ミステリーナンバーかどうかを判定する関数
bool isMysteryNumber(int n) {
for (int i = 1; i <= n/2; i++) {
int j = revNum(i);
if (i + j == n) {
cout << i << " " << j;
return true;
}
}
return false;
}
int main() {
int num = 121;
if (isMysteryNumber(num)) {
cout << "\n" << num << " is a Mystery number";
} else {
cout << num << " is not a Mystery number";
}
}実行結果
29 92 121 is a Mystery number
コードの解説
revNum 関数: 引数として受け取った整数を文字列に変換し、reverse() で文字列を反転させてから、再び整数に戻しています。これにより、元の数の桁を逆にした数値が得られます。
isMysteryNumber 関数: 1 から n/2 までループし、各 i の反転数 j を計算します。i + j が n と一致した時点で、そのペアを出力して true を返します。ループを n/2 までにしているのは、片方の数が n/2 を超えるともう片方がそれより小さくなり、すでにチェック済みの組み合わせになるためです。
main 関数: 判定したい数値(ここでは 121)を渡し、結果に応じてメッセージを出力します。この例では 29 + 92 = 121 が成立するため、「121 is a Mystery number」と表示されます。
-
C++でデューデニー数(Dudeney Number)を判定する方法
デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ
-
C++で数値が2つの三角数の和として表現できるか判定する方法
本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ