-3

2GBのRAMを搭載した32ビットコンピュータで計算を行う方法。私が長い数の算術を行うとき、プログラムはゴミの価値を与え始めます。しかし、私は数万桁までの数字を計算したいのです。どんな言語でも受け入れられます。

4

9 に答える 9

6

Javaを使用BigIntegerすると、ほぼ瞬時に実行されます。

import java.math.BigInteger;
import java.util.Random;

public class Int10k {

    public static final void main(String[] args) {
        BigInteger  a, b, c;
        Random rnd;

        // Here I'll create two random 40,000-bit numbers (that's
        // rather more than 10,000 decimal digits) and add them
        // together. For specific numbers, you can use the
        // BigInteger(String) constructor, which creates a
        // BigInteger based on a String of digits.
        rnd = new Random();
        a = new BigInteger(40000, rnd);
        b = new BigInteger(40000, rnd);
        c = a.add(b);

        System.out.println(a);
        System.out.println("+");
        System.out.println(b);
        System.out.println("=");
        System.out.println(c);
    }
}
于 2012-07-21T13:04:36.150 に答える
3

JavaBigIntegerまたはその他のBigInteger実現を使用できます

例:

BigInteger left = new Biginteger("1845618948745415218748");
BigInteger right = new BigInteger("1845452132132132123132123123");

out.println(left.add(right));
于 2012-07-21T12:53:48.743 に答える
3

ここで使用されているライブラリはBCMathです。デフォルトでPHPに含まれています。

$big_int1 = "";
$big_int2 = "";

for( $i = 0; $i < 10000; ++$i ) {
    $big_int1 .= mt_rand(0,9);
    $big_int2 .= mt_rand(0,9);
}//0.019520044326 seconds or 20 milliseconds

echo bcadd( $big_int1, $big_int2 ); //0.00037407875061035 seconds or 374 microseconds

私のために即座に実行します。文字列の連結/乱数の生成は、とにかくボトルネックです。

于 2012-07-21T12:55:10.533 に答える
2

さまざまな言語の便利なリンクを次に示します。

  • Python(組み込み)
  • C / C ++- GMP、おそらく最も効率的な汎用任意精度数値ライブラリ
  • .NET 4(組み込み)
  • .NET- GnuMpDotNet-GMPを使用するため、非常に効率的ですが、演算子のオーバーロードなどにより操作が簡単になるという利点があります。
  • Java(組み込み)
  • PHP- BC数学
于 2012-07-21T13:17:57.067 に答える
1

これは言語の問題ではなく、数学の問題です。http: //en.wikipedia.org/wiki/Arbitrary-precision_arithmeticよく知られており、それを解決するためのプログラミングライブラリがたくさんあります。

于 2012-07-21T13:00:48.207 に答える
1

すべてのCommonLisp実装には、任意の長さの整数が含まれています。通常、実装はそれを処理するためにCライブラリにパントしますが、Lispで作業する方が便利です。

たとえば、Clisp、SBCL、またはCMUCLを見てください(Web検索でこれらのプロジェクトのホームページが見つかります)。

于 2013-06-18T19:45:00.890 に答える
0

質問はそれなりに抽象的ですが、そうです、そのような計算機を実装することは可能です。ある時点で、既存のクラス(JavaのBigIntegerなど)に依存するのではなく、ディスクのキャッシュと手動での操作の実装に依存する必要があるかもしれませんが、技術的には実行可能です。

于 2012-07-21T12:56:03.637 に答える
0

はい、可能です。これはそのためのパブリックドメインのc++ライブラリです:https ://mattmccutchen.net/bigint/

于 2012-07-21T12:56:34.217 に答える
0

ここに素晴らしいアルゴリズムがあります。define2array[0-9]を使用して、各結果に応じて新しい配列を定義できます。

{0,1,2,3,4,5,6,7,8,9}
{0,1,2,3,4,5,6,7,8,9}
/////

次に、結果を入力する2次元配列を定義できます。

0 1 ....
1 ...

*や/などについても同じです。次に、文字列型を読み取り、文字列出力を作成して出力します。

于 2012-07-21T12:59:31.997 に答える