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

C++でaのb乗(a^b)の桁数を求める方法

数のべき乗は、繰り返し乗算や言語標準の関数を使えば簡単に計算できます。

この記事では、aのb乗を求め、その結果の桁数を取得する方法を解説します。まずは具体例を見てみましょう。

入力

a = 5
b = 2

出力

2

入力

a = 7
b = 6

出力

6

アルゴリズム

  • 数値aとbを初期化します。
  • abの値を求めます。
  • log10(n)の切り上げ(ceil)を取ると、数nの桁数が得られます。
  • その値を計算して返します。

ポイントは「常用対数の性質」です。ある整数nの桁数は、log10(n)を切り上げることで求められます。たとえば512ならlog10(512)≈2.71となり、切り上げると3桁とわかります。

C++での実装

以下は、上記のアルゴリズムをC++で実装したコードです。

#include <bits/stdc++.h>
using namespace std;

int getDigitsCount(int a, int b) {
    return ceil(log10(pow(a, b)));
}

int main() {
    int a = 8;
    int b = 3;
    cout << getDigitsCount(a, b) << endl;
    return 0;
}

実行結果

上記のコードを実行すると、次の結果が出力されます。

3

83 = 512 は3桁なので、正しく桁数が取得できていることがわかります。

より安全な書き方:大きな数への対策

pow(a, b) の結果が非常に大きくなると、int型などの範囲を超えてオーバーフローしたり、浮動小数点数の精度誤差が生じたりする恐れがあります。

そこで、対数の性質 log10(ab) = b × log10(a) を利用すれば、べき乗を実際に計算せずに済むため、より安全かつ効率的です。

int getDigitsCount(long long a, long long b) {
    return ceil((double)b * log10((double)a));
}

この方法なら、結果がどれほど巨大になってもオーバーフローを気にせず桁数だけを求められます。競技プログラミングなどでも頻出のテクニックなので、ぜひ覚えておきましょう。

  1. 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 など 問題を理解するための具

  2. C++で五胞体数(ペンタトープ数)を求める方法

    五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の