C++でa^bとb^aのどちらが大きいかを判定する方法
このチュートリアルでは、C++を使って ab と ba のうち、どちらの値が大きいかを判定するプログラムを作成します。
指数の値をそのまま計算すると桁数が膨大になり、オーバーフローのリスクがあります。そこで対数(log)を活用することで、安全かつ効率的に大小を比較できます。それでは、具体的な手順を見ていきましょう。
解決の手順
- 変数 a と b の値を初期化します。
- 両辺の対数を取ります。
b × log aとa × log bをそれぞれ計算します。- 計算した2つの値を比較します。
a × log bの方が大きければ、「ba の方が大きい」と出力します。b × log aの方が大きければ、「ab の方が大きい」と出力します。- どちらでもない場合は、「両者は等しい」と出力します。
対数関数は単調増加であるため、log(ab) = b × log a、log(ba) = a × log b という変換により、元の指数同士の大小関係を保ったまま比較できるのがポイントです。
サンプルコード
実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a = 4, b = 7;
long double x = (long double) a * (long double)(log((long double)(b)));
long double y = (long double) b * (long double)(log((long double)(a)));
if (y > x) {
cout << "a ^ b is greater" << endl;
}else if (y < x) {
cout << "b ^ a is greater" << endl;
}else {
cout << "Both are equal" << endl;
}
return 0;
}実行結果
上記のコードを実行すると、次のような結果が出力されます。
a ^ b is greater
この例では a = 4、b = 7 であり、47 = 16384、74 = 2401 となるため、「a ^ b is greater」が正しく出力されています。
まとめ
この記事では、対数を利用して ab と ba の大小関係を効率的に判定する方法を紹介しました。指数を直接計算せずに比較できるため、大きな数を扱う場合でもオーバーフローを気にせず実装できます。チュートリアルの内容についてご不明な点があれば、コメント欄でお気軽にお知らせください。
-
C++ STLのlldiv()関数の使い方を徹底解説
C++ STLのlldiv()関数は、2つの整数(long long型)の除算を行い、その結果である「商(quot)」と「余り(rem)」を同時に取得できる便利な関数です。通常、商と余りを別々に求める場合は演算を2回行う必要がありますが、lldiv()を使えば1回の呼び出しで両方の値を効率的に得ることができます。 基本構文と戻り値 lldiv()はヘッダーファイル <cstdlib> で定義されており、以下のような形式で使用します。 lldiv_t lldiv(long long numer, long long denom); 引数には被除数(割られる数)と除数(割る数)を指定し
-
なぜC/C++では修飾子を使うのか?データ型修飾子の基礎をわかりやすく解説
修飾子(モディファイア)とは何か? 修飾子(modifier)とは、基本となるデータ型の意味を変更し、プログラムの要件に合わせてふるまいを調整するためのキーワードです。 たとえば「時間」を表す変数を考えてみましょう。時間がマイナスになることは論理的にあり得ないため、負の値を扱えない unsigned(符号なし)として宣言するのが自然です。このように、修飾子を使うことでメモリの使い方や表現できる値の範囲を、用途に応じて最適化できるのです。 C++で使える4つのデータ型修飾子 C++では、char、int、double といったデータ型の前に修飾子を付けることができます。主な修飾子は以下の4つで