カラツバ実装C ++

マイケル

そこで、C ++でカラツバのアルゴリズムを実装することにしました(生前の2番目のコーディングクラス以来、この言語を使用していないので、非常に錆びています)。とにかく、私は疑似コードを1行ずつ追跡したと思いますが、それでも私のアルゴリズムは間違った答えでポップアップし続けます。


    x = 1234, y = 5678
    Actual Answer: x*y ==> 7006652
    Program output: x*y ==> 12272852

*注:私はMacで実行しており、実行する実行可能ファイルを作成するために以下を使用しています c++ -std=c++11 -stdlib=libc++ karatsuba.cpp

とにかく、ここにドラフトされたコードがあります。私が間違っていることや、c ++を改善する方法について自由に声をかけてください。

ありがとう!

コード:

    #include <iostream>
    #include <tuple>
    #include <cmath>
    #include <math.h>
    
    using namespace std;
    
    /** Method signatures **/
    tuple<int, int> splitHalves(int x);
    int karatsuba(int x, int y, int n);
    
    int main()
    {
        int x = 5678;
        int y = 1234;
        int xy = karatsuba(x, y, 4);
        cout << xy << endl;
        return 0;
    }
    
    int karatsuba(int x, int y, int n)
    {
        if (n == 1)
        {
            return x * y;
        }
        else
        {
            int a, b, c, d;
            tie(a, b) = splitHalves(x);
            tie(c, d) = splitHalves(y);
            int p = a + b;
            int q = b + c;
            int ac = karatsuba(a, c, round(n / 2));
            int bd = karatsuba(b, d, round(n / 2));
            int pq = karatsuba(p, q, round(n / 2));
            int acbd = pq - bd - ac;
            return pow(10, n) * ac + pow(10, round(n / 2)) * acbd + bd;
        }
    }
    
    
    /** 
     * Method taken from https://stackoverflow.com/questions/32016815/split-integer-into-two-separate-integers#answer-32017073
     */
    tuple<int, int> splitHalves(int x)
    {
        const unsigned int Base = 10;
        unsigned int divisor = Base;
        while (x / divisor > divisor)
            divisor *= Base;
        return make_tuple(round(x / divisor), x % divisor);
    }
ドミトリー・クズミノフ

あなたのコードにはたくさんの問題があります...

まず、ここに間違った係数があります。

            int q = b + c;

である必要があります:

            int q = c + d;

次に、の実装はsplitHalves機能しません。それを試してください:

tuple<int, int> splitHalves(int x, int power)
{
        int divisor = pow(10, power);
        return make_tuple(x / divisor, x % divisor);
}

それはあなたの入力に対して「正しい」答えを与えるでしょう、しかし...それはカラツバ法ではありません。

まず、「半分に分割」する必要がないことを覚えておいてください。半分の最初の数字が意味する12 * 3456分割を考慮してa = 0b = 12あなたの実装が与えながらa = 1b = 2

Karastubaは全体として、整数ではなく配列で機能します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

cでのカラツバ実装

分類Dev

カラツバアルゴリズム-実装エラー

分類Dev

Pythonクラスでのカラツバ再帰関数の実装、エラー

分類Dev

ビット操作を使用してカラツバ乗算を実装する方法

分類Dev

BigIntegerを使用したカラツバアルゴリズムの実装エラー

分類Dev

カスタムヒープバイナリツリーの実装-ランダムノードの削除

分類Dev

カテゴリツリーの実装

分類Dev

通常の形のツリーフォールド左スカラの実装

分類Dev

Scalaツリー/グラフの実装

分類Dev

ノードとツリーに個別のクラスを使用したバイナリツリーの実装

分類Dev

Bloomberg C#APIでのオーバーライドの実装

分類Dev

C ++クラスの実装

分類Dev

matplotlibカラーバー境界は実装されていません

分類Dev

JavaOAuth2プロバイダーの実装| カスタムエラー

分類Dev

カスタムHttp実装で「プロバイダーなし」エラー

分類Dev

Golangのバイナリツリーに順トラバーサルを実装する方法

分類Dev

トラバーサルを使用したJavaでのバイナリ検索ツリーの実装

分類Dev

カスタムクラスの実装

分類Dev

C ++でのラスタライズと深度バッファの実装

分類Dev

C ++でコールバックを実装する際のc ++-fpermissiveエラー

分類Dev

フラグメントを使用してツールバーにSearchViewを実装する

分類Dev

カスタムVector <T>クラスにpush_back(T && c)を実装する

分類Dev

AWS API Gatewayカスタム認証ラムダのC#実装

分類Dev

カラツバアルゴリズムの実装では、この方法では小さい数だけが真にカウントされますが、大きな答えは正しくありません。何が問題なのでしょうか。

分類Dev

c ++データ構造は、ベクトルを使用してバイナリツリーを実装します

分類Dev

Objective-Cでのバイナリサーチツリーの実装に関する指示が必要

分類Dev

モンテカルロツリー検索UCT実装

分類Dev

デカルト実装で再帰的なツリー

分類Dev

C ++サーバ用のJava TCPクライアントの実装

Related 関連記事

  1. 1

    cでのカラツバ実装

  2. 2

    カラツバアルゴリズム-実装エラー

  3. 3

    Pythonクラスでのカラツバ再帰関数の実装、エラー

  4. 4

    ビット操作を使用してカラツバ乗算を実装する方法

  5. 5

    BigIntegerを使用したカラツバアルゴリズムの実装エラー

  6. 6

    カスタムヒープバイナリツリーの実装-ランダムノードの削除

  7. 7

    カテゴリツリーの実装

  8. 8

    通常の形のツリーフォールド左スカラの実装

  9. 9

    Scalaツリー/グラフの実装

  10. 10

    ノードとツリーに個別のクラスを使用したバイナリツリーの実装

  11. 11

    Bloomberg C#APIでのオーバーライドの実装

  12. 12

    C ++クラスの実装

  13. 13

    matplotlibカラーバー境界は実装されていません

  14. 14

    JavaOAuth2プロバイダーの実装| カスタムエラー

  15. 15

    カスタムHttp実装で「プロバイダーなし」エラー

  16. 16

    Golangのバイナリツリーに順トラバーサルを実装する方法

  17. 17

    トラバーサルを使用したJavaでのバイナリ検索ツリーの実装

  18. 18

    カスタムクラスの実装

  19. 19

    C ++でのラスタライズと深度バッファの実装

  20. 20

    C ++でコールバックを実装する際のc ++-fpermissiveエラー

  21. 21

    フラグメントを使用してツールバーにSearchViewを実装する

  22. 22

    カスタムVector <T>クラスにpush_back(T && c)を実装する

  23. 23

    AWS API Gatewayカスタム認証ラムダのC#実装

  24. 24

    カラツバアルゴリズムの実装では、この方法では小さい数だけが真にカウントされますが、大きな答えは正しくありません。何が問題なのでしょうか。

  25. 25

    c ++データ構造は、ベクトルを使用してバイナリツリーを実装します

  26. 26

    Objective-Cでのバイナリサーチツリーの実装に関する指示が必要

  27. 27

    モンテカルロツリー検索UCT実装

  28. 28

    デカルト実装で再帰的なツリー

  29. 29

    C ++サーバ用のJava TCPクライアントの実装

ホットタグ

アーカイブ