2GBのRAMを搭載した32ビットコンピュータで計算を行う方法。私が長い数の算術を行うとき、プログラムはゴミの価値を与え始めます。しかし、私は数万桁までの数字を計算したいのです。どんな言語でも受け入れられます。
9 に答える
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);
}
}
JavaBigIntegerまたはその他のBigInteger実現を使用できます
例:
BigInteger left = new Biginteger("1845618948745415218748");
BigInteger right = new BigInteger("1845452132132132123132123123");
out.println(left.add(right));
ここで使用されているライブラリは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
私のために即座に実行します。文字列の連結/乱数の生成は、とにかくボトルネックです。
これは言語の問題ではなく、数学の問題です。http: //en.wikipedia.org/wiki/Arbitrary-precision_arithmeticよく知られており、それを解決するためのプログラミングライブラリがたくさんあります。
すべてのCommonLisp実装には、任意の長さの整数が含まれています。通常、実装はそれを処理するためにCライブラリにパントしますが、Lispで作業する方が便利です。
たとえば、Clisp、SBCL、またはCMUCLを見てください(Web検索でこれらのプロジェクトのホームページが見つかります)。
質問はそれなりに抽象的ですが、そうです、そのような計算機を実装することは可能です。ある時点で、既存のクラス(JavaのBigIntegerなど)に依存するのではなく、ディスクのキャッシュと手動での操作の実装に依存する必要があるかもしれませんが、技術的には実行可能です。
はい、可能です。これはそのためのパブリックドメインのc++ライブラリです:https ://mattmccutchen.net/bigint/
ここに素晴らしいアルゴリズムがあります。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 ...
*や/などについても同じです。次に、文字列型を読み取り、文字列出力を作成して出力します。