C++で2のN乗(2^N)の下2桁を求めるプログラム
この記事では、数値Nが与えられたときに、C++で2のN乗(2^N)の下2桁を求めるプログラムの作成方法を解説します。
問題の概要
下2桁を求める際のポイントは、計算の過程で下2桁だけを保持し、それ以外の桁は無視することです。これにより計算量を大幅に抑えることができます。
具体例で問題を確認しましょう。
入力: N = 12
出力: 96
解説
2^12 = 4096 なので、その下2桁は「96」となります。
解法アプローチ①:素直な計算方法
最もシンプルな方法は、まず2^Nの値をそのまま計算し、その結果を100で割った余りを求めることです。剰余演算(%100)を取ることで、自然と下2桁が得られます。
実装例
#include <iostream>
using namespace std;
int findLastDigit(int N){
int powerVal = 1;
for(int i = 0; i < N; i++){
powerVal *= 2;
}
return powerVal%100;
}
int main() {
int N = 14;
cout<<"The last two digits of 2^"<<N<<" is "<<findLastDigit(N);
return 0;
}
出力結果
The last two digits of 2^14 is 84
しかし、このアプローチには重大な欠点があります。Nが大きくなると、powerValがint型の上限を超えてオーバーフローしてしまうのです。そのため、大きなNに対しては正しい結果が得られません。
解法アプローチ②:下2桁のみを扱う効率的な方法
より優れたアプローチは、各ステップで下2桁の値だけを保持し、それに2を掛け続ける方法です。
これは剰余演算の性質「(a × b) % m = ((a % m) × (b % m)) % m」を利用したもので、途中計算で毎回100の剰余を取ることで、値が大きくなりすぎるのを防げます。
例えば2^14の場合、下2桁は「84」です。ここで巨大な数全体ではなく「84」に2を掛ければ計算量を節約できます。つまり、(84 × 2) % 100 = 68 となり、これが2^15の下2桁になります。
実装例
#include <iostream>
using namespace std;
int findLastDigit(int N){
int powerVal = 1;
for(int i = 0; i < N; i++){
powerVal = (powerVal * 2)%100;
}
return powerVal;
}
int main() {
int N = 15;
cout<<"The last two digits of 2^"<<N<<" is "<<findLastDigit(N);
return 0;
}
出力結果
The last two digits of 2^15 is 68
この方法なら、ループ内の値が常に100未満に収まるため、Nがどれほど大きくてもオーバーフローせずに正確な下2桁を求められます。計算量もO(N)と効率的で、実用的なプログラミングにおける剰余演算の活用例として非常に参考になるテクニックです。
-
C++でN階乗の合計の下2桁を求める方法
本記事では、1!からN!までの階乗の合計について、その下2桁(一の位と十の位)を求める方法を解説します。例えば N = 4 の場合、1! + 2! + 3! + 4! = 33 となるため、一の位は「3」、十の位は「3」であり、結果は「33」となります。この問題には重要な性質があります。N が 5 より大きい場合、その階乗の一の位は必ず 0 になるため、6! 以降の項は一の位に一切影響を与えません。同様に、N が 10 以上になると十の位も 0 のまま変化しなくなります。したがって、N = 10 以上では結果は常に「13」で固定されます。実際に N = 1 から 10 までの階乗の値を表に整理
-
C++でグラフ行列の逆行列を求めるプログラムの実装方法
本記事では、グラフ行列の逆行列を求めるC++プログラムについて詳しく解説します。行列の逆行列は、対象となる行列が正則(非特異)である場合、すなわち行列式が0ではない場合にのみ存在します。 逆行列を求める手法は複数ありますが、ここでは随伴行列(余因子行列の転置)と行列式を組み合わせて逆行列を計算する方法を紹介します。 アルゴリズムの手順 逆行列を求める際の処理の流れは以下の通りです。 開始 行列の逆行列を求める関数 INV() を定義する。 行列式を計算する関数 DET() を呼び出す。 随伴行列を生成する関数 ADJ() を呼び出す。 次の公式に基づいて逆行