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

C++でロシアン・ピーザント法(ロシア農民の掛け算)を実装するプログラム

ロシアン・ピーザント法(Russian Peasant Algorithm、通称「ロシア農民の掛け算」)は、2つの数値の積を高速に計算するためのアルゴリズムです。大きな数同士の乗算でも、シフト演算と加算だけで効率よく処理できる点が大きな特徴です。

アルゴリズム

基本的な流れは以下のとおりです。

開始
    RussianPeasant(num1, num2)
    result = 0
    while (num2 > 0)
        if (num2 の最下位ビットが 1)
            result = result + num1
        num1 を左に1ビットシフト(2倍)
        num2 を右に1ビットシフト(半分)
    return result
終了

仕組みのポイントを整理すると次のようになります。

  • 片方の数(m)が0になるまでループを繰り返します。
  • m の最下位ビットが1のときだけ、その時点の n を結果に加算します。
  • n は毎回2倍(左シフト)、m は毎回半分(右シフト)していくことで、通常の筆算と同じ原理で積を求められます。

サンプルコード

実際にC++で実装した例がこちらです。

#include <iostream>
using namespace std;
unsigned int russianPeasant(unsigned int n, unsigned int m) {
    int result = 0;
    while (m > 0) {
        if (m & 1)
            result = result + n;
        n = n << 1;
        m = m >> 1;
    }
    return result;
}
int main() {
    cout << russianPeasant(10, 20) << endl;
    cout << russianPeasant(7, 6) << endl;
    return 0;
}

出力結果

200
42

このプログラムでは russianPeasant(10, 20) の結果として 200、russianPeasant(7, 6) の結果として 42 が出力されます。乗算演算子を使わずに正しい積が求まっていることがわかります。

  1. C++でコラッツ予想を実装するプログラムの作成方法

    このチュートリアルでは、コラッツ予想(Collatz Conjecture)を実装するC++プログラムについて解説します。 コラッツ予想とは? コラッツ予想は、1937年にドイツの数学者ロタール・コラッツが提唱した有名な未解決問題です。「任意の正の整数に対して決められた操作を繰り返し適用すると、必ず最終的に1に到達する」という非常にシンプルな主張でありながら、現在まで証明も反証もされていないことで知られています。 本記事では、ある数nが与えられたとき、以下の2つの操作を繰り返し適用することでnを1に変換できるかどうかを判定するプログラムを作成します。 nが偶数の場合: n を n/2 に置

  2. 配列の全要素を乗算するC++プログラムの解説

    整数型の要素を持つ配列が与えられたとき、配列内のすべての要素を掛け合わせ、その積を表示することを考えます。本記事では、この問題をC++(C言語スタイルのコード)で解く方法を、アプローチ、アルゴリズム、サンプルコード、実行結果まで順を追って解説します。 例 入力: arr[]={1,2,3,4,5,6,7} 出力: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 入力: arr[]={3, 4, 6, 2, 7, 8, 4} 出力: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 解き方のアプローチ この問題は、累積用の一時変数を用意し、配列の要素を先頭