javascript 中的极大数量
Extremely large numbers in javascript
我正在研究 Project Euler 问题(目前 question 13)。
对于这个问题,我必须找到 100 个数字之和的前 10 位数字,所有数字的大小都与此类似:
91,942,213,363,574,161,572,522,430,563,301,811,072,406,154,908,250
我想我可以使用 Java 的 BigInteger 之类的东西,但我开始解决 JavaScript 中的问题(我正在努力提高我的 js 工作能力),并且我想继续使用它,甚至解决这个问题。
如果可能的话,我想坚持使用纯 JS。
您将需要一个基于 javascript 的 BigInteger 库。有很多可供选择。这是一个 https://github.com/peterolson/BigInteger.js
你可以这样使用
var n = bigInt("91942213363574161572522430563301811072406154908250")
.plus("91942213363574161572522430563301811072406154908250");
您总是可以将总和转换为 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);
令人惊讶的是,将所有值粘贴到一个数组中并将它们全部相加并仅取前 10 位数字就可以了。我一定是在我的代码某处有错别字,之前它不起作用。
我敢肯定,做这么简单的事情并非在所有情况下都有效(就像@AlexMcmillan 和@zerkms 一直在争论的那样)。我认为最安全的选择是@bhspencer 提到的 BigInteger 库,但在某些情况下,添加前 x 位有效数字和 y 位数字作为缓冲区似乎也值得一试。
我使用数组并使用函数更新所有条目来完成此操作。
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;
Here 是一个带有问题 20 代码的 JSFiddle。
Javascript 最近获得了一种新的原始数据类型 BigInt
(截至 2020 年 1 月的第 4 阶段提案)。
https://github.com/tc39/proposal-bigint
Chrome、Firefox 和少数其他浏览器已开始在较新版本中支持此功能 (check compatibility here),而其他浏览器仍在实现它。
https://developers.google.com/web/updates/2018/05/bigint
基本上它可以使用像
这样的文字来声明
var a = 1n;
或
var b = BigInt('22222222222222222222222222222222');
数学运算符不会在 BigInt 和 Number 之间进行自动转换,所以
1 + 1n
会抛出错误。
我正在研究 Project Euler 问题(目前 question 13)。
对于这个问题,我必须找到 100 个数字之和的前 10 位数字,所有数字的大小都与此类似:
91,942,213,363,574,161,572,522,430,563,301,811,072,406,154,908,250
我想我可以使用 Java 的 BigInteger 之类的东西,但我开始解决 JavaScript 中的问题(我正在努力提高我的 js 工作能力),并且我想继续使用它,甚至解决这个问题。
如果可能的话,我想坚持使用纯 JS。
您将需要一个基于 javascript 的 BigInteger 库。有很多可供选择。这是一个 https://github.com/peterolson/BigInteger.js
你可以这样使用
var n = bigInt("91942213363574161572522430563301811072406154908250")
.plus("91942213363574161572522430563301811072406154908250");
您总是可以将总和转换为 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);
令人惊讶的是,将所有值粘贴到一个数组中并将它们全部相加并仅取前 10 位数字就可以了。我一定是在我的代码某处有错别字,之前它不起作用。
我敢肯定,做这么简单的事情并非在所有情况下都有效(就像@AlexMcmillan 和@zerkms 一直在争论的那样)。我认为最安全的选择是@bhspencer 提到的 BigInteger 库,但在某些情况下,添加前 x 位有效数字和 y 位数字作为缓冲区似乎也值得一试。
我使用数组并使用函数更新所有条目来完成此操作。
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;
Here 是一个带有问题 20 代码的 JSFiddle。
Javascript 最近获得了一种新的原始数据类型 BigInt
(截至 2020 年 1 月的第 4 阶段提案)。
https://github.com/tc39/proposal-bigint
Chrome、Firefox 和少数其他浏览器已开始在较新版本中支持此功能 (check compatibility here),而其他浏览器仍在实现它。
https://developers.google.com/web/updates/2018/05/bigint
基本上它可以使用像
这样的文字来声明var a = 1n;
或
var b = BigInt('22222222222222222222222222222222');
数学运算符不会在 BigInt 和 Number 之间进行自动转换,所以
1 + 1n
会抛出错误。