ゆるゆるプログラミング

・整数の累乗

累乗は、同じ数を何回か掛け合わせることです。

ここで作成するメソッドは、掛ける元の数(基数)と掛ける回数(指数)を指定することで累乗を得るものです。

基数をa、指数をnとすると、累乗=anです。例えばa=3でn=5であれば、累乗=35=3×3×3×3×3=243となります。これは3を5回掛け合わせる計算を意味しています。

それでは、整数累乗を計算するプログラムを2つ紹介します。

以下は、整数累乗を計算を行うメソッドを含むJavaのソースコード例の1つ目です。

このソースは、累乗のルール通りに、aの値をn回掛けて結果を得るものです。

Power1.java ← クリックしてダウンロードページに移動
001:    public class Power1 {
002:    	// aのn乗を戻すメソッド
003:    	static int power( int a, int n )
004:    	{
005:    		// 結果の初期値
006:    		int result = 1;
007:    
008:    		// nが1の場合に計算
009:    		if ( 1 <= n ) {
010:    			// aをn回掛ける
011:    			for ( int i = 0; i < n; ++ i ) {
012:    				result = result * a;
013:    			}
014:    		}
015:    
016:    		// 結果を戻す
017:    		return result;
018:    	}
019:    
020:    
021:    	// メイン
022:    	public static void main( String[] args ) {
023:    		// 変数の宣言
024:    		int a, n;
025:    		int ans;
026:    
027:    		// べき乗の計算
028:    		a = 5;
029:    		n = 7;
030:    		ans = power( a, n );
031:    
032:    		// 結果表示
033:    		System.out.println( a + "の" + n + "乗は、" + ans );
034:    	}
035:    }

Power1.javaの出力結果

5の7乗は、78125

以下が、作成した整数累乗を計算するメソッドの部分です。

002:    	// aのn乗を戻すメソッド
003:    	static int power( int a, int n )
004:    	{
005:    		// 結果の初期値
006:    		int result = 1;
007:    
008:    		// nが1の場合に計算
009:    		if ( 1 <= n ) {
010:    			// aをn回掛ける
011:    			for ( int i = 0; i < n; ++ i ) {
012:    				result = result * a;
013:    			}
014:    		}
015:    
016:    		// 結果を戻す
017:    		return result;
018:    	}

これは、整数累乗を計算するpowerメソッドで、aとnを渡すことでanを計算して戻します。

for文を使って、aをn回掛けています。

nが0以下の値のとき、1を戻すようにしています。

以下は、整数累乗を計算を行うメソッドを含むJavaのソースコード例の2つ目です。

Power2.java ← クリックしてダウンロードページに移動
001:    public class Power2 {
002:    	// aのn乗を戻すメソッド
003:    	static int power( int a, int n )
004:    	{
005:    		// 結果の初期化
006:    		int result;
007:    
008:    		// nが0以下の場合、1を戻す
009:    		if ( 0 >= n )
010:    			result = 1;
011:    		else {
012:    			// nが1場の場合
013:    			switch ( n ) {
014:    				case 1:
015:    					// n=1の場合、aを戻す
016:    					result = a;
017:    					break;
018:    				case 2:
019:    					// n=2の場合、a*aを戻す
020:    					result = a * a;
021:    					break;
022:    
023:    				default:
024:    					int pow = power( a, n / 2 );
025:    					result = pow * pow;
026:    	
027:    					// nが奇数の場合
028:    					if ( 1 == ( n % 2 ) ) {
029:    						result *= a;
030:    					}
031:    					break;
032:    			}
033:    		}
034:    
035:    		return result;
036:    	}
037:    
038:    
039:    	// メイン
040:    	public static void main( String[] args ) {
041:    		// 変数の宣言
042:    		int a, n;
043:    		int ans;
044:    
045:    		// べき乗の計算
046:    		a = 5;
047:    		n = 7;
048:    		ans = power( a, n );
049:    
050:    		// 結果表示
051:    		System.out.println( a + "の" + n + "乗は、" + ans );
052:    	}
053:    }

Power2.javaの出力結果

5の7乗は、78125

002:    	// aのn乗を戻すメソッド
003:    	static int power( int a, int n )
004:    	{
005:    		// 結果の初期化
006:    		int result;
007:    
008:    		// nが0以下の場合、1を戻す
009:    		if ( 0 >= n )
010:    			result = 1;
011:    		else {
012:    			// nが1場の場合
013:    			switch ( n ) {
014:    				case 1:
015:    					// n=1の場合、aを戻す
016:    					result = a;
017:    					break;
018:    				case 2:
019:    					// n=2の場合、a*aを戻す
020:    					result = a * a;
021:    					break;
022:    
023:    				default:
024:    					int pow = power( a, n / 2 );
025:    					result = pow * pow;
026:    	

これは、整数累乗を計算するpowerメソッドで、aとnを渡すことでanを計算して戻します。

nが0以下の値のとき、1を戻すようにしています。

Power1.javaとの違いは、再帰を使って掛け算の回数を減らしていることです。掛け算の回数を減らすことで結果を得るまでの時間を短くすることができます。

例えば、累乗=35の場合を見ていきましょう。

3を5回掛けて3×3×3×3×3=243の結果を得ます。

この式を少しだけ変形すると

 (3×3)×(3×3)×3

となります。さらに(3×3)をpowとおくと

 pow×pow×3

となります。

powは(3×3)なので掛け算が1個、pow×pow×3は掛け算が3個です。

よって、powを計算した値で、pow×pow×3を計算すると掛け算4回で結果を得ることができます。

次に、累乗=39の場合を見ていきましょう。

(3×3×3×3)をpowとおくと

 39=pow×pow×3

となります。

さらにpow'=3×3とおくと

 pow=3×3×3×3=(3×3)×(3×3)=pow'×pow'

となり、powは掛け算2回で結果を得ることができます。

よって、pow×pow×3を計算すると掛け算4回で結果を得ることができます。

このように、指数(掛ける回数)を2分割して得られた結果どおしの掛け算を行い、掛け算の回数を減らしています。

以下は、整数累乗を計算を行ために必要な掛け算の回数を表示するJavaのソースコードです。参考にしてくだい。

PowerN.java ← クリックしてダウンロードページに移動
001:    public class PowerN {
002:    	// aのn乗の掛け算の回数を戻すメソッド
003:    	static int power_n( int a, int n )
004:    	{
005:    		// 結果の初期化
006:    		int result = 0;
007:    
008:    		// nが2以上の場合
009:    		if ( 2 <= n ) {
010:    			// nが1場の場合
011:    			switch ( n ) {
012:    				case 2:
013:    					// n=2の場合、a*aを戻す
014:    					result += 1;
015:    					break;
016:    
017:    				default:
018:    					int pow_num = power_n( a, n / 2);
019:    					result += pow_num;
020:    					result += 1;
021:    	
022:    					// nが奇数の場合
023:    					if ( 1 == ( n % 2 ) ) {
024:    						result += 1;
025:    					}
026:    					break;
027:    			}
028:    		}
029:    
030:    		return result;
031:    	}
032:    
033:    
034:    	// メイン
035:    	public static void main( String[] args ) {
036:    		// 変数の宣言
037:    		int a, n;
038:    		int ans;
039:    
040:    		// べき乗の計算
041:    		a = 3;
042:    		n = 19;
043:    		ans = power_n( a, n );
044:    
045:    		// 結果表示
046:    		System.out.println( a + "の" + n + "乗に使う掛け算の回数は、" + ans );
047:    	}
048:    }

PowerN.javaの出力結果

3の19乗に使う掛け算の回数は、6

指数(掛ける回数)に対して、実際に掛け算を行う回数が少なくなることが確認できます。

■関連コンテンツ

数学関数について 数学関数について解説
累乗 pow Math.powの使い方について解説

■新着情報

2019.09.13 長さの単位変換 1マイル、1フィートは何m?
2019.09.06 クイックソート 高速に配列に並び替える方法
2019.09.05 中央値(メディアン) 配列に格納されている値の中央値を求める
2019.09.05 最頻値 配列から出現回数が最も多い値の取得
2019.09.03 配列値の反転 配列の反転処理
2019.08.05 トランプの操作 トランプを操作するクラス

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

 

 

 

 

 

 

 

 

 

Topへ