C++で数値が8の累乗かどうかを判定する方法
この記事では、ある数値が8の累乗であるかどうかを、簡単な手法を使って判定する方法を紹介します。例えば4096という数値は8の累乗(84)なので、プログラムはtrueを返します。
判定の仕組み
考え方は非常にシンプルです。まず log8(num) を計算します。この結果が整数であれば、その数値nは8の累乗であると判断できます。
ただし、浮動小数点数の計算には誤差が伴うため、単純に整数かどうかを比較するだけでは不十分な場合があります。そこで、trunc(n) 関数を使ってdouble型の値の小数部分を切り捨てた整数値を求め、元の値との差が十分に小さいかどうかを確認します。この誤差の許容範囲を0.000001として扱うことで、浮動小数点演算の誤差による誤判定を防ぐことができます。
サンプルコード
#include <iostream>
#include <cmath>
using namespace std;
bool isPowerOfEight(int n) {
double val = log(n)/log(8); //底を8としたlog nを求める
return (val - trunc(val) < 0.000001);
}
int main() {
int number = 4096;
if(isPowerOfEight(number)){
cout << number << " is power of 8";
} else {
cout << number << " is not power of 8";
}
}
実行結果
4096 is power of 8
コードの解説
isPowerOfEight 関数では、対数の性質を利用して log(n) / log(8) を計算することで、底を8とした対数値を求めています。この値が整数に近ければ、nは8の累乗であることになります。
なお、この方法では負の数や0、1などの入力に対する考慮が必要な場合があります。実務で使用する際は、事前にnが正の数であるかどうかのチェックを追加すると、より堅牢なコードになります。
同様の手法は、2の累乗や10の累乗など、他の底の累乗判定にも応用できます。
-
C++で巨大な数値が25で割り切れるかどうかを判定する方法
本記事では、ある数値が25で割り切れるかどうかを判定する方法を解説します。扱う数値が非常に大きい(桁数が多い)場合、通常の整数型では表現しきれないため、数値を文字列として受け取って処理します。25の倍数の判定ルール数値が25で割り切れるかどうかは、下2桁だけを見れば判定できます。具体的には、以下のいずれかの条件を満たしていれば、その数は25で割り切れます。下2桁が「00」である下2桁の数値自体が25で割り切れる(00、25、50、75)これは、100が25で割り切れるため、下2桁より上の部分は必ず25の倍数になるという性質によるものです。サンプルコード#include <bits/std
-
C++で大きな数が11で割り切れるかどうかを判定する方法
本記事では、C++を用いて、ある数が11で割り切れるかどうかを判定する方法を解説します。ここで扱うのは非常に大きな数であるため、int 型や long long 型といった標準的な整数型には収まりません。そこで、数値を文字列として受け取り、桁ごとに処理を行います。 11の倍数判定法とは ある整数が11で割り切れるかどうかは、次の有名な判定法で簡単に確認できます。 左から順に各桁を見て、奇数番目の桁の合計と偶数番目の桁の合計をそれぞれ求める。 両者の差が0、または11の倍数であれば、その数は11で割り切れる。 特に、奇数番目の桁の合計と偶数番目の桁の合計が一致していれば、差は必ず0になるた