13

私は mpz (C) や BigInteger (Java) に似たクラスを書くことをいじっています。これはただの楽しみですので、私が自分で書いてはいけないことについては話さないでください。

私は次のようなクラスを持っています:

public class HugeInt
{
    public List<Integer> digits;

    public HugeInt(String value)
    {
        // convert string value into its seperate digits. 
        // store them in instance variable above
    }
}

さて、このクラスの add() とsubtract() メソッドを実行するのはとても簡単です。次に例を示します。

private List<Integer> add(List<Integer> a, List<Integer> b)
    {
        List<Integer> smallerDigits = (compareDigits(a,b) < 0) ? a : b;
        List<Integer> largerDigits = (compareDigits(a,b) >= 0) ? a : b;
        List<Integer> result = new ArrayList<Integer>();

        int carry = 0;

        for(int i = 0; i < largerDigits.size(); i++)
        {
            int num1 = largerDigits.get(i);
            int num2 = (i < smallerDigits.size()) ? smallerDigits.get(i) : 0;

            result.add((num1 + num2 + carry) % 10);
            carry = ((num1 + num2 + carry) / 10);
        }

        if (carry != 0) result.add(carry);

        return result;
    }

同様に、乗算を行うこともそれほど難しくありませんでした。

ウィキペディアにはDivision Algorithmsのページがありますが、私がやろうとしていることに対してどれが適切かわかりません。

これらの正の整数 (数字として表される) は任意の長さになる可能性があるため、数字単位以外で操作を実行しないようにする必要があります。

しかし、誰かが'sとして表される 2 つの数値の除算を行うための正しい方向に私を向けることはできますか? また、これは整数除算であるため、剰余は無視できます。List<Integer>

4

4 に答える 4

5

あなたは単に長い除算を行うことができますが、これは確かにそれを行う最適な方法ではありません(編集:ただし、このようなことはそれを行う良い方法のようです)。大きな整数ライブラリの他の実装を見ることができ、少しグーグルするとかなりの有用な情報が得られます。

于 2010-02-25T23:49:26.990 に答える
2

これは少しやり過ぎかもしれませんが、これが楽しみのために行うようなものである場合は、これを読んで楽しむことができます : http://www.fizyka.umk.pl/nrbook/c20-6.pdf「C の数値レシピ」の「任意の精度」)。この本のほとんどと同様に、非常に魅力的で、適切な説明と多くのコードが含まれています。

于 2010-02-26T00:59:48.007 に答える
0

この記事A Larger Integerでは、"より大きな整数" の桁ごとの操作を実装する方法は示されていませんが、2 つの Int64 型に関して (明らかに完全に機能する) 128 ビット整数を実装する方法は示されています。Int64 型の配列を使用して任意の長さの整数を生成するようにアプローチを拡張することはそれほど難しくないと思います。記事を振り返って数分過ごしただけですが、乗算の実装は、任意の長さでかなり複雑になる可能性があるようです。

この記事では、バイナリ除算を使用して除算 (商と剰余) を実装する方法を示します。

于 2010-05-26T17:12:51.730 に答える
0

整数除算を扱っているだけだと思う​​ので、それほど難しくありません。掛け算は足し算の繰り返し、割り算はその逆、引き算の繰り返しです。したがって、被除数から除数を何回引くことができるかを確認します。たとえば、10 から 3 を 3 回引いても <0 にならないため、整数の除算商は 3 になります。

于 2010-02-25T23:46:12.050 に答える