C++でウッダル数(Woodall Number)を判定する方法
この問題では、ある数値が与えられ、それがウッダル数(Woodall number)であるかどうかを判定します。
ウッダル数とは、次の式で表される特殊な数のことです。
Wn = n × 2n − 1
最初の5つのウッダル数は 1、7、23、63、159 です。
具体例を見て、問題を理解しましょう。
入力
X = 159
出力
Yes
159 は 5 × 25 − 1 = 159 と表せるため、ウッダル数であると判定できます。
解法のアプローチ
この問題を解くには、まず数の性質を観察します。ウッダル数は n × 2n − 1 という形で表されるため、必ず奇数になります。したがって、与えられた数が偶数であれば、その時点でウッダル数ではないと判断できます。
数が奇数の場合は、その数に 1 を加えてから、2 で割れる限り繰り返し 2 で割っていき、割った回数をカウントします。そして、各段階で「割った回数」と「残った数」が一致するかどうかを確認します。
この方法が成立する理由は、ウッダル数に 1 を加えると n × 2n という形になるためです。2 で割り続けた結果、最終的に残る値が n であり、そのときの割った回数も n に等しければ、その数はウッダル数であると判定できます。
実装例
#include <iostream>
using namespace std;
bool isWoodallNumber(int x){
if (x % 2 == 0)
return false;
if (x == 1)
return true;
x += 1;
int p = 0;
while (x % 2 == 0){
x = x / 2;
p++;
if (p == x)
return true;
}
return false;
}
int main() {
int x = 1424;
cout << x;
(isWoodallNumber(x)) ? cout << " はウッダル数です" : cout << " はウッダル数ではありません";
return 0;
}出力
1424 はウッダル数ではありません
コードの解説
isWoodallNumber 関数では、まず入力値が偶数かどうかを確認し、偶数であれば false を返します。次に、x が 1 の場合は true を返します(1 = 1 × 21 − 1 はウッダル数です)。
その後、x に 1 を加え、2 で割れる限り割り続けながら割った回数 p をカウントします。割った回数 p と残りの値 x が一致した時点で true を返し、ループが終了しても一致しなければ false を返します。
計算量
時間計算量: O(log n) — 数を 2 で割り続けるため、反復回数は対数オーダーに収まります。
空間計算量: O(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 など 問題を理解するための具
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の