C++
 Computer >> コンピューター >  >> プログラミング >> C++

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" を表示します。この方法なら、大きな数同士の累乗比較でもオーバーフローを心配せずに処理できるのが大きなメリットです。

  1. 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}$

  2. 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) 番目の項に相当します。したがって、等差数列の一般