C++でN番目の丁寧数(ポライト数)を求める方法
丁寧数(ポライト数)とは
丁寧数(polite number)とは、2つ以上の連続する正の整数の和として表すことができる正の整数のことです。
丁寧数の列は以下のようになります。
3, 5, 6, 7, 9, 10, 11, 12, 13, 14 ...
なお、2の累乗(1, 2, 4, 8, 16 ...)は連続する正の整数の和として表せないため、丁寧数には含まれません。この性質が、後述する公式で対数(底2)が使われる理由になっています。
n番目の丁寧数を求める公式
n番目の丁寧数を求めるには、次の公式を使用します。
n + log2(n + log2(n))
C++の標準ライブラリにある log 関数はデフォルトで底が e(自然対数)である点に注意が必要です。底2の対数を求めるには、log の計算結果を log(2) で割ります。
アルゴリズム
n番目の丁寧数を求めるアルゴリズムは非常にシンプルです。
- 求めたい番号 N を用意します。
- 計算を実行する前に、n の値を1だけ増やしておきます。
- 上記の公式に従って、n番目の丁寧数を計算します。
C++での実装例
以下は、上記のアルゴリズムをC++で実装したコードです。
#include <bits/stdc++.h>
using namespace std;
double getNthPoliteNumber(double n) {
n += 1;
return n + (log((n + (log(n) / log(2.0))))) / log(2.0);
}
int main() {
double n = 10;
cout << (int)getNthPoliteNumber(n) << endl;
return 0;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
14
この例では n = 10 を渡しているため、10番目の丁寧数である「14」が出力されます。
-
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 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の