C++でx^yとy^xのどちらが大きいかを判定する方法
この問題では、2つの数値 x と y が与えられ、x^y と y^x のうち大きい方を求めることが課題となります。
問題の概要
問題は非常にシンプルです。「x の y 乗」と「y の x 乗」を計算し、どちらの値が大きいかを判定します。
入出力例
入力: x = 4, y = 5
出力: 1024
説明:
x^y = 4^5 = 1024
y^x = 5^4 = 625
したがって、大きい方の値は 1024 となります。
解法のアプローチ
最も素直な解法は、x^y と y^x の値をそのまま計算して比較することです。しかし、x や y が大きくなると累乗の値が急激に巨大化し、オーバーフローを起こす恐れがあります。
そこで役立つのが対数(log)を利用した数学的な手法です。対数関数は単調増加であるため、対数を取っても大小関係は変わりません。両辺の対数を取ると、比較対象は次のように変換できます。
- x^y の対数 → y × log(x)
- y^x の対数 → x × log(y)
つまり、「y * log(x)」と「x * log(y)」を比較するだけで、元の累乗同士の大小を正確に判定できます。これらの値は浮動小数点数として簡単かつ安全に計算できます。
解法を実装したプログラム
サンプルコード
#include <bits/stdc++.h>
using namespace std;
int main() {
double x = 3, y = 7;
double ylogx = y * log(x); // x^y の対数に相当
double xlogy = x * log(y); // y^x の対数に相当
if (ylogx > xlogy)
cout << x << "^" << y;
else if (ylogx < xlogy)
cout << y << "^" << x;
else
cout << "None";
cout << " の方が大きい値です";
return 0;
}
実行結果
3^7 の方が大きい値です
コードの解説
まず、y * log(x) と x * log(y) をそれぞれ計算します。次に if 文で両者を比較し、大きい方に対応する式(この例では 3^7)を出力します。両者が等しい場合は "None" を表示します。この方法なら、大きな数同士の累乗比較でもオーバーフローを心配せずに処理できるのが大きなメリットです。
-
C++を使ってAとBの間に挿入されるN個の幾何平均(等比中項)を求める方法
3つの整数 A、B、N が与えられたとき、AとBの間に挿入されるN個の幾何平均(等比中項)を求めることを考えます。例として、A = 2、B = 32、N = 3 の場合、出力は 4、8、16 となります。考え方:等比数列の性質を利用するこの問題は非常にシンプルです。AとBをそれぞれ初項・末項とする等比数列の中間に、N個の要素を挿入すればよいのです。G1、G2、…、Gn をn個の幾何平均とすると、数列は次のようになります。A、G1、G2、…、Gn、Bこのとき、Bは数列の (N + 2) 番目の項に相当します。そこで、等比数列の一般項の公式から、以下の式が成り立ちます。$$B=A*R^{N+1}$
-
C++を使ってAとBの間のN個の相加平均(等差中項)を求める方法
問題の概要 3つの整数 A、B、N が与えられたとき、A と B の間に N 個の相加平均(等差中項)を挿入することを考えます。例えば、A = 20、B = 32、N = 5 の場合、出力は「22, 24, 26, 28, 30」になります。 解法の考え方 この課題は非常にシンプルです。A を初項、B を末項とする等差数列の中に、N 個の要素を挿入すればよいのです。 挿入する N 個の相加平均を A1, A2, …, An とすると、数列全体は次のようになります。 A, A1, A2, …, An, B このとき、B は数列の (N + 2) 番目の項に相当します。したがって、等差数列の一般