【C++】M番目とN番目の項が与えられたときに等比数列(GP)のP番目の項を求める方法
この問題では、m、n、m番目の項、n番目の項、p の5つの値が与えられます。私たちの課題は、等比数列(GP:Geometric Progression)の M番目と N番目の項が分かっているとき、その数列の P番目の項を求めることです。
つまり、等比数列の m番目の項と n番目の項の値をもとにして、同じ数列の p番目の項を計算する必要があります。
具体例を使って問題を確認してみましょう。
入力
m = 7, mthTerm = 1458, n = 10, nthterm = 39366, p = 3
出力
18
解き方のアプローチ
ここでは、ある等比数列が与えられているものとします。この等比数列は次のように表せます。
GP = a , a×r , a×r2, a×r3, …
一般項(T番目の項)を求める公式は以下の通りです。
T番目の項 = a × r(T-1)
ここで、m番目の項と n番目の項が与えられているので、それぞれ次のように書けます。
m番目の項 = a × (r ^ (m-1)) n番目の項 = a × (r ^ (n-1))
この2つの式を辺々割り算すると、初項 a が消えて次の式が得られます。
m番目の項 ÷ n番目の項 = r ^ (m - n)
この式から公比 r の値を求めることができます。さらに、m番目の項の値を使えば、初項 a も次のように計算できます。
m番目の項 = a × (r^(m-1))
こうして a と r の値が分かれば、p番目の項は次の公式で簡単に求められます。
p番目の項 = a × (r^(p-1))
コードのポイント
findRinGP():m番目と n番目の項から公比 r を計算します。m と n の大小関係に応じて、指数の符号が負にならないように処理しています。findTermGP():求めた公比 r から初項 a を逆算し、p番目の項を返します。- 計算量は O(1) で、非常に効率的な解法です。
この解法の動作を示すプログラムがこちらです。
例
#include <cmath>
#include <iostream>
using namespace std;
double findRinGP(double m, double n, double mth, double nth) {
if (m < n)
return pow(nth / mth, 1.0 / (n - m));
return pow(mth / nth, 1.0 / (m - n));
}
double findTermGP(int m, int n, double mth, double nth, int p) {
double r = findRinGP(m, n, mth, nth);
double a = mth / pow(r, (m - 1));
return ( a * pow(r, (p - 1)) );
}
int main() {
int m = 7, n = 10, p = 5;
double mth = 1458, nth = 39366;
cout<<"The "<<p<<"th of the series is "<<findTermGP(m, n, mth, nth, p);
return 0;
}
出力
The 5th of the series is 162
この例では、公比 r = 3、初項 a = 2 の等比数列(2, 6, 18, 54, 162, …)が導かれ、5番目の項として 162 が出力されます。同様に p = 3 を指定すれば 18 が得られます。
-
C++で初項と公差が与えられた等差数列(AP)に特定の数値が含まれるか判定する方法
等差数列(Arithmetic Progression:AP)の初項 a と公差 d が与えられたとき、指定した数値 x がその数列の項として存在するかどうかを判定する問題について解説します。例えば、初項 a = 1、公差 d = 3 の場合、数列は 1, 4, 7, 10, ... となります。ここで x = 7 が数列に含まれるかを調べると、答えは「はい」となります。解法のアプローチこの問題は、以下の手順で効率的に解くことができます。公差 d が 0 の場合: 数列は定数列になるため、a == x であれば true を返し、そうでなければ false を返します。公差 d が 0 でない
-
【C++】合計と最大公約数(GCD)が与えられた2つの数を求める方法
この記事では、2つの数 a と b の合計(sum)と最大公約数(GCD)が与えられたときに、元の2つの数を復元する方法を解説します。条件を満たす組み合わせが存在しない場合は -1 を返します。 例えば、合計が 6、GCDが 2 とすると、答えは 4 と 2 になります(4 + 2 = 6、gcd(4, 2) = 2 を満たすため)。 考え方(アプローチ) GCDが分かっているということは、2つの数がどちらもGCDの倍数であることが確定します。この性質を利用すると、次の手順で答えを導き出せます。 候補の生成: 片方の数をGCDそのものと仮定すると、もう片方は「合計 − GCD」となります。