web-dev-qa-db-ja.com

JavaScriptの非常に大きな数値

私はプロジェクトオイラー問題に取り組んでいます(現在 質問1 )。

この質問では、100の数字の合計の最初の10桁を、次のようなサイズで見つける必要があります。

91,942,213,363,574,161,572,522,430,563,301,811,072,406,154,908,250

私はJavaのBigIntegerのようなものを使用できると思いますが、JavaScriptの問題を解決し始め(仕事のためにjs機能を向上させようとしています)、この問題を解決するためにも引き続き使用したいと思います。

できれば純粋なJSに固執したいです。

12
JEJoll

JavaScriptベースのBigIntegerライブラリが必要になります。から選択する多くがあります。ここに1つあります https://github.com/peterolson/BigInteger.js

こんな風に使えます

var n = bigInt("91942213363574161572522430563301811072406154908250")
    .plus("91942213363574161572522430563301811072406154908250");
13
bhspencer

Javascriptは最近、新しいプリミティブデータ型BigIntを取得しました。 https://github.com/tc39/proposal-bigint

Chromeのみがこの機能をリリースしましたが、他のブラウザはまだそれを実装しています。 https://developers.google.com/web/updates/2018/05/bigint =

基本的には、次のようなリテラルを使用して宣言できます

_var a = 1n;_

または

var b = BigInt('22222222222222222222222222222222');

数学演算子はBigIntとNumber間の自動変換を行わないため、_1 + 1n_はエラーをスローします。

8
Qi Fan

いつでも合計をstringに変換し、.と結果を取得-このようなもの:

var sum = 2384762348723648237462348;
sum = sum.toString(); // "2.3847623487236483e+24"

// Rip out the "."
sum = sum.substr(0, 1) + sum.substr(2);

// Grab the first 10 characters
var firstTen = sum.substr(0, 10);
0
Alex McMillan

驚いたことに、配列内のすべての値を固定し、それらをすべて加算して、最初の10桁を取得するだけでうまくいきました。以前は機能しなかったときに、コードのどこかにタイプミスがあったはずです。

この単純なことを実行しても、すべてのケースでうまくいくとは限りません(@AlexMcmillanと@zerkmsが議論されているように)。最も安全な賭けは@bhspencerによって言及されたBigIntegerライブラリだと思いますが、場合によっては、最初のx桁の有効数字とy桁をバッファーとして追加することも一見の価値があるようです。

0
JEJoll

私はこれを配列を使用して行い、すべてのエントリを関数で更新しました。

function f(a) {
  for (let i = 0; i < a.length - 1; i++) {
      a[i + 1] = a[i + 1] + parseInt(a[i] / 10);
      a[i] = a[i] % 10;
  }
  return a;
}
// remember to init the array with enough elements for all digits
var a = Array(200);
a.fill(0);
a[0] = 1;

ここ は、問題20のコードを含むJSFiddleです。

0
cheesehead